5

在执行“ n ”异步函数 后,我不知道如何执行回调,例如:

var after4AsyncOperation = function(){
    //do something...
}
process.nextTick(function(){
    //do stuff
})
process.nextTick(function(){
    //do stuff
})
process.nextTick(function(){
    //do stuff
})
process.nextTick(function(){
    //do stuff
})

有没有一种方法可以after4AsyncOperation在 4 个异步函数之后执行,而不必在另一个函数中编写函数,例如:

    var after4AsyncOperation = function(){
    //do something...
}
process.nextTick(function(){
    //do stuff
    process.nextTick(function(){
        //do stuff
        process.nextTick(function(){
            //do stuff
            process.nextTick(function(){
                //do stuff
                after4Asyncoperation();
            })
        })
    })
})
4

2 回答 2

8

我建议使用诸如Caolan 的 Async 之类的异步库。然后,您可以使用async.parallelasync.seriesasync.autoauto是最灵活的,但比其他的要慢一些;之间进行选择,parallel并且series需要有关您尝试执行的操作的更多信息-您的第一个示例将是并行操作,但您的第二个示例是串联的。

但是,如果您不想使用库,则可以编写自定义内容。我会这样做:

var numFuncs = 4;
var callback = function(){
  numFuncs--;
  if(numFuncs == 0) {
    after4AsyncOperation();
  }
}
var after4AsyncOperation = function(){
    //do something...
}
process.nextTick(function(){
    //do stuff
    callback();
})
process.nextTick(function(){
    //do stuff
    callback();
})
process.nextTick(function(){
    //do stuff
    callback();
})
process.nextTick(function(){
    //do stuff
    callback();
})

这通过从我们期望回调被调用的次数( )开始倒计时numFuncs并且仅after4AsyncOperation在我们被回调正确的次数时才调用。

于 2013-02-17T18:35:26.073 回答
3

您可以利用具有此功能和许多其他不错功能的出色异步库。要具体完成您想要做的事情,您可以使用系列:

https://github.com/caolan/async#series

或并行:

https://github.com/caolan/async#parallel

两者的区别在于 series 一个接一个地运行所有的函数,而 parallel 同时运行所有的函数。在任何一种情况下,它们都完成后会有一个回调,这似乎是您想要完成的。

于 2013-02-17T17:20:24.520 回答