依次进行节点异步调用

莫诺克

我有几个异步请求,它们从URL中获取一些数据。我遇到的问题是我实际上想延迟发送json响应,直到所有请求都返回。代码看起来像这样:

getFirstStuff(callback) //imagine this is async
{
    console.log('gettingFirstStuff');
    callback(stuff);
}

function getFurtherStuff(callback) //imagine this is async
{
    console.log('gettingFurtherStuff');
    callBack(thing);
}

function getStuff(callBack)
{

    getFirstStuff(function(stuff) // async
    {
        // stuff is an array of 3 items

        stuff = stuff.map(function(item) // map is synchronous
        {
            // For each item in stuff make another async request
            getFurtherStuff( function(thing) { // this is also async
                stuff.thing = thing;
            });

            return item;
        });

        callback(stuff); 
    });

}

router.get('/getstuff', function(req, res, next) {
    getStuff(function(stuff)
    {
       console.log('finished stuff');

       // RETURN RESPONSE AS JSON
       res.json(stuff);
    });
});

输出将是:

gettingFirstStuff
finished stuff
gettingFurtherStuff
gettingFurtherStuff
gettingFurtherStuff

但应该是:

gettingFirstStuff
gettingFurtherStuff
gettingFurtherStuff
gettingFurtherStuff
finished stuff

我知道原因是getFurtherStuff是异步的,并且在getFurtherStuff异步调用返回结果之前,将从地图返回项目。我的问题是,在调用最终回调“ callback(stuff)”之前,等待这些调用完成的标准方法是什么?

纳拉布诺维茨

有很多方法可以解决此问题。如果您在添加依赖项方面没有问题,那么图书馆喜欢async并且queue可能是最好的选择。

没有外部库的最简单的选择就是计算异步作业并在完成所有工作后完成:

// assuming stuff is an array
var counter = 0;
var jobCount = stuff.length;

// wrap callback in one that checks the counter
var doneCallback = function() {
    if (counter >= jobCount) {
        // we're ready to go
        callback(stuff);
    }
};

// run jobs
stuff.map(function(item) {
    getFurtherStuff(item, function(itemThing) {
        // process async response
        stuff.thing = itemThing;
        // increment counter;
        counter++;
        // call the wrapped callback, which won't fire
        // until all jobs are complete
        doneCallback();
    });
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章