[英]Using async.waterfall
我正在使用node.js和異步包。
這是我的代碼:
async.waterfall(
[
function(callback) {
var data = getSomeData();
callback(null, data);
},
function(data, callback) {
someFunctionThatNeedsData(data);
callback(null, 'done');
}
],
function(err, result) {
}
);
getSomeData
有一個異步HTTP請求,該請求從Web服務獲取一些數據。 我想等到收到響應后,再返回該數據並將其傳遞給someFunctionThatNeedsData
。
我期望的是getSomeData
(包括其中的回調)必須在繼續調用someFunctionThatNeedsData
之前完成。
問題是,盡管在此處使用了waterfall
函數,但data
到達someFunctionThatNeedsData
的時間someFunctionThatNeedsData
。
此外,從console.log
我可以看到,結束getSomeData
達到內部的回調之前getSomeData
甚至開始。
我使用了不正確的waterfall
,還是這里的工具不正確? 如果不正確,我可以使用什么來達到預期的效果?
還是我必須辭職於具有深度嵌套的回調(我將在以后的工作中使用它),並且必須通過將內聯代碼提取到命名函數中來減輕它的負擔?
getSomeData()有一個異步http請求,該請求從Web服務獲取一些數據。
這就是問題。 執行流程已經繼續到回調並執行了。 這就是異步函數的工作方式!
您必須將回調傳遞給getSomeData
,一旦HTTP請求完成,該回調將getSomeData
進行調用。 是的:您可能需要嵌套回調。
如果您有異步操作。 您無需使用async.waterfall。 您可以按照承諾鏈樣式進行操作。
getSomeData().then(function(data)
{
var changeData = changeYourData(data);
return changeData;
}).then(function(changedData)
{
// some more stuff with it. You can keep on forwarding to the next `then`
}).catch(function(err)
{
// if any error throw at any point will get catch here
}).finally(function()
{
// this one will guarantee get call no matter what,
// exactly the same like async.waterfall end of chain callback
});
此示例將與Q , When和符合標准的任何promise lib一起使用。
如果您需要使用async.waterfall(因為你可以用Array.map駕駛它)你只需要在你的回調then
async.waterfall(
[
function(callback) {
// A
getSomeData().then(function(data)
{
callback(null, data);
});
// B - just throw the whole thing in
callback(null , getSomeData());
},
function(data, callback) {
// A
someFunctionThatNeedsData(data);
// B
data.then(function(resolvedData)
{
someFunctionThatNeedsData(resolvedData);
callback(null, 'done');
});
}
],
function(err, result) {
});
希望能有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.