这个代码是如何同步的?

function foo(cb) { if (!someAuditCondition) { return cb(new Error(...)); // <- This is NOT asynchronous, but the rest of the function is! } doSomeAsynAction(function (err, data) { if (err) { return cb(err); } cb(data); }); } 

那部分是如何同步的? 以及如何在process.nextTick()中处理该cb将使其asynchronous。

这段代码是同步的,因为你根本没有使用任何asynchronous函数,即使它是一个callback,你只是将响应传递给下一个函数调用,callback本质上不是asynchronous的,asynchronous函数是这样做的。

 function foo(cb) { if (!someAuditCondition) { return process.nextTick(() => { cb(new Error('err')); }); }; } function foo(cb) { if (!someAuditCondition) { return setImmediate(() => { cb(new Error('err')); }); }; } function foo(cb) { if (!someAuditCondition) { return setTimeout(() => { cb(new Error('err')); }, 0); }; } 

process.nextTick – 将你的callback放在event loop queue的顶部,意思是说,它将把你的函数从主执行线程放到libuv消息队列的顶部,然后libuv会在每个之后检查如果在堆栈中执行任何同步function,则打勾,如果没有,则会popupcallback;

setImmediate – 将它放入队列中,但这并不总是可以的;

setTimeout(cb, 0) – 与setImmediate实际上是一样的

当你使用一个asynchronous函数时,你在OS线程中发送你的callback函数,这个callback函数将被libuv传回主执行线程。 这意味着在nodejs中是asynchronous的。

在函数中调用callback的事实不是asynchronous的。 我很确定你写这样的代码:

 function B () { return 1; } function A () { var b = B(); ... } 

如果你认为,这是没有什么不同:

 function A(B) { var b = B() } 

B可以是任何函数,包括匿名函数(你的callback函数)。