3

我试图弄清楚何时使用 process.nextTick。下面我使用异步库来控制我的代码流,并且想知道我是否应该在结束回调中调用 nextTick。

async.parallel([
    function (callback) {
        // do something
        callback(data);
    },
    function (callback) {
        // do something
        callback(data);        
    }
], 
// callback
function (data) {
    process.nextTick(function () {
        // do something
    });
});
4

2 回答 2

5

在不确切知道您的“做某事”是什么的情况下,我看不出您nextTick在这种情况下需要使用的任何理由。当您nextTick有理由将函数的执行推迟到事件循环的下一次迭代时使用。您可能想阅读理解process.nextTick以获取更多详细信息。

另外,请注意异步的parallel任务完成回调需要参数err, data,所以你应该这样做:

async.parallel([
    function (callback) {
        // do something
        callback(null, data);
    },
    function (callback) {
        // do something
        callback(null, data);        
    }
], 
// callback
function (err, data) {
    if (err) throw err;
    // do something
});

主要区别在于,如果其中一个并行任务返回错误(callback使用真实的第一个参数调用),则会立即调用最终回调。

于 2012-12-18T20:48:07.550 回答
0

我的经验是,要让 forasync.parallel和其他类似功能正常工作,您需要使所有任务绝对异步;我喜欢异步库,它是我对承诺等的第一选择,但如果你不强制任务异步,可能会出现一些奇怪的行为。

见这里: https ://github.com/caolan/async#common-pitfalls-stackoverflow

所以应该是:

async.parallel([

function(cb){
   process.nextTick(function(){
          doSomePotentiallySyncThing(cb);
   });
},

function(cb){
   process.nextTick(function(){
          doSomePotentiallySyncThing(cb);
   });
},
function(cb){

     definitelyAsync(cb);  // if it's **definitely** async, then we don't need process.nextTick

}
], function complete(err, results){

    // we are in the final callback

});

我对此有 99% 的把握。

于 2016-03-30T06:11:12.250 回答