簡體   English   中英

使用異步瀑布

[英]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
});

此示例將與QWhen和符合標准的任何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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM