2016-01-22 129 views
0

我执行“GET”请求一个URL取回的响应,所以我有一个处理请求请求模块使用

var makeRequest = function(objs, callback){ 
    var url = 'adasda..'; 
    //... 
    var result = null; 
    request(url, function(error, response, body){ 
      if(!error && response.statusCode === 200){ 
       result = body; 
       callback(null, body) 
      } 
    }); 

    return result; 
} 

在我的主要功能的功能我正在调用上述功能

function main(values, callback){ 
    //...some logic 
    var newValue={....} 

    if(some conditional){ 
     newValue = makeRequest(values,callback); //newValue gets appended with new data 
    } 

    sendData(null, newValue, callback); //this function does a post 
} 

var sendData = function(....){} 

我注意到一旦makeRequest的得到执行,它会立即向前走,然后执行送出数据和那是因为要求模块是一个异步操作。

我该如何等待newValue对象被填充,然后sendData()应该被调用?

+0

你不能等。您必须在回调中使用响应,并且在收到响应后您想要执行的任何代码必须实际处于回调中。这就是你如何编程异步响应。它与同步编程不同。副本中提供了许多示例。 – jfriend00

回答

0

等到回调触发。我更新了你的代码。

var makeRequest = function(objs, callback) { 
    var url = 'adasda..'; 

    request(url, function(error, response, body) { 
    if (!error && response.statusCode === 200) { 
     callback(null, body) 
    } 
    }); 
}; 

function main(values, callback) { 

    var newValue = {} 

    if (some conditional) { 
    makeRequest(values, function(error, result) { 
     // Call sendData once we get the data 
     sendData(null, result, callback); 
     callback(error, result); 
    }); 
    } 

} 

var sendData = function() {}; 

要避免嵌套的回调,可以使用Promises