我应该使用process.nextTick吗?

时间:2012-12-18 20:31:16

标签: node.js asynchronous

我正试图了解何时使用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
    });
});

2 个答案:

答案 0 :(得分:5)

如果不确切知道你的“做某事”是什么,我认为在这种情况下你不需要使用nextTick。当您有理由将函数的执行推迟到事件循环的下一次迭代时,可以使用nextTick。您可能需要阅读Understanding process.nextTick了解更多详情。

另外,请注意async的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
});

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

答案 1 :(得分:0)

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

见这里: 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%。