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将使其异步。
答案 0 :(得分:0)
这段代码是同步的,因为你根本就没有使用任何异步函数,即使它是一个回调你只是将响应传递给下一个函数调用,回调本质上不是异步的,异步函数就是这样做的。< / p>
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
几乎相同
当您使用异步函数时,您将在os线程中发送回调,该回调将由libuv
传输回主执行线程。这意味着nodejs中的asynchronous
。
答案 1 :(得分:0)
在函数中调用回调的事实不是异步的。我很确定你写了这样的代码:
function B () {
return 1;
}
function A () {
var b = B();
...
}
如果您认为,它与以下内容没有区别:
function A(B) {
var b = B()
}
B
可以是任何函数,包括匿名函数(你的回调函数)。