Node.js 我应该使用process.nextTick吗

Node.js 我应该使用process.nextTick吗,node.js,asynchronous,Node.js,Asynchronous,我正在设法弄清楚什么时候使用process.nextTick。下面我使用异步库来控制代码流,我想知道是否应该在结束回调中调用nextTick async.parallel([ function (callback) { // do something callback(data); }, function (callback) { // do something callback(data);

我正在设法弄清楚什么时候使用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
    });
});

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

另外,请注意,async的
并行
任务完成回调采用参数
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第一个参数调用
回调
),则会立即调用最终回调。

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

请看这里:

因此,它应该是:

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%的把握。

是什么让你认为应该在那里调用
nextTick
?我读了这篇文章,其中一个例子是关于异步回调的。因此,我想知道我是否应该考虑在所有回调中使用nextTick,以避免在服务器负载过重的情况下出现潜在的问题。我的测试在使用nextTick和不使用nextTick的情况下都能很好地工作,所以当nextTick得到最好的使用时,我仍然会绞尽脑汁。只有当您想将某些代码的执行推迟到当前回调执行完毕且任何已排队的回调已运行之后,才可以使用
nextTick
。我有一个问题-如果有回调,调用是否自动异步?是否所有回调都放在节点事件循环中,或者在某些情况下,只有回调不会使节点中的进程异步?不一定。回调只是一个“稍后”调用的函数——它本质上没有什么特别之处;这只是简单的函数调用,回调不会自动安排在事件循环中(事实上,这正是您可能使用的
nextTick
)。当然,“以后”的含义完全取决于您向其传递回调的函数。例如,
function(cb){cb();}
不是异步的,因为您知道回调将在同一调用堆栈上,在事件循环的同一迭代中立即调用。。。。但这并不一定是坏的:考虑从数据库中检索数据的函数,也可以缓存数据。代码>函数get(key,cb){if(cache[key])cb(cache[key]);else getFromDb(key,function(dbresult){cache[key]=dbresult;cb(dbresult);}如果缓存了数据,函数会同步返回数据(这很好:它会让程序更快),如果需要从数据库中获取数据,则会异步返回。谢谢,这很有意义。但节点如何决定哪些内容放在事件循环上,哪些不放在事件循环上?是否只有由nexttick包装的IO或进程被放入循环中。例如,如果我有一组5个回调(一个调用另一个),除非我使用Nexttick或进行IO调用,否则它们都是同步调用的吗?通常,在另一个线程上发生的任何事情(如I/O)或传递给
Nexttick
setTimeout
的回调,和
setInterval
将排队等待下次运行事件循环时调用。