这个代码是如何同步的?
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函数)。