2017-03-05 26 views
0

我正在處理一個模塊,該模塊使用request模塊返回從http請求中檢索到的數據。但是,當我想要將數據傳遞給函數時,我遇到了問題。以此爲例。從請求模塊傳遞數據出功能?

function getData(term) { 
    var parsedData 
    request.post(url, term, (err, response, body) => { 
     if (!err && response.statusCode == 200) { 
       parsedData = doSomethingTo(body); 
     } 
    }); 
    return parsedData; 
} 

這種方法不起作用,因爲該函數的getData()異步地執行與所述請求實際上可以返回正確的數據之前返回的值。

function getData(term) { 
    var parsedData 
    request.post(url, term, (err, response, body) => { 
     if (!err && response.statusCode == 200) { 
       parsedData = doSomethingTo(body); 
       return parsedData; 
     } 
    }); 
} 

這種方法也不管用,因爲它只會使要求功能返回所分析的數據,而不是功能的getData。

我怎麼可能讓父函數返回從請求功能解析的數據?

+0

request.post是異步的,你要麼有一個回調函數傳遞到與該parsedData執行你的getData功能,或者使用無極 –

回答

0

使用無極這樣的:

function getData(term) { 
    return new Promise(function(resolve){ 
     request.post(url, term, (err, response, body) => { 
     if (!err && response.statusCode == 200) { 
       var parsedData = doSomethingTo(body); 
       resolve(parsedData); 
     } 
     }); 
    }); 
} 

,你可以調用你的函數是這樣的:

getData(term).then(function(data){ 
    //console.log(data); 
}) 
0

使用藍鳥承諾模塊非常快。

var Promise = require('bluebird'); 
function getData(term) { 
return new Promise(function(resolve,reject){ 


    if (!err && response.statusCode == 200) { 
      var parsedData = doSomethingTo(body); 
      resolve(parsedData); 
    }else{ 
    reject(err); 
    } 
}); 

}; 

然後你調用函數的地方做到這一點;

var promise = getData(term); 
promise.then(function(data){console.log(data)}).catch(function(err){console.error(err)}); 
+0

請務必你的錯誤,激活在網絡上。遵循這種模式。 – Remario