首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用async.waterfall

使用async.waterfall
EN

Stack Overflow用户
提问于 2014-03-15 02:27:01
回答 2查看 3.9K关注 0票数 2

我使用的是node.js和异步包。

下面是我的代码:

代码语言:javascript
复制
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时仍未定义。

此外,从console.log中我可以看到,getSomeData的末尾甚至在getSomeData内部的回调开始之前就到达了。

我是不正确地使用waterfall,还是这里不是正确的工具?如果这是不对的,我可以用什么来达到预期的效果?

还是我必须接受深度嵌套的回调(在以后的工作中,我会这样做),并且必须通过将内联代码提取到命名函数中来减轻它?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-15 02:29:38

getSomeData()有一个异步http请求,它从web服务中获取一些数据。

这就是问题所在。执行流已经继续到回调并执行它。这就是异步函数的工作方式!

您必须将回调传递给getSomeData,它在HTTP请求完成后调用它。所以,是的:你可能需要嵌套回调。

票数 1
EN

Stack Overflow用户

发布于 2015-10-24 07:12:46

如果您有异步操作。您不需要使用async.waterfall。你可以用一种承诺链的方式来做。

代码语言:javascript
复制
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
});

这个示例将适用于问:什么时候和遵循标准的任何承诺库。

如果您需要使用async.waterfall (因为您可以使用Array.map驱动它),则只需在then中回调即可

代码语言:javascript
复制
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) {
});

希望能帮上忙。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22418790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档