这段代码是同步的,因为你根本没有使用任何异步函数,即使它是一个回调,你只是将响应传递给下一个函数调用,回调本质上不是异步的,异步函数是这样做的。
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
- 将会把你的回调在event loop queue
是什么意思的顶部,是它将把你的功能从主执行线程,并把它放在libuv
消息队列的顶部,然后libuv
会在每次打勾后检查是否有任何同步功能在栈中执行,如果没有,那么它会弹出你的回调;
setImmediate
- 将它放入队列中,但这并不总是可以的;
setTimeout(cb, 0)
- 实际上是一回事setImmediate
当您使用您发送您的回调在操作系统线程异步函数将由libuv
被运回主执行线程。这意味着nodejs中的asynchronous
。
实际上难以正确格式化和缩进代码吗? – 2017-08-24 14:29:37
函数的其余部分在哪里?你为什么认为它是异步的? –