這段代碼是同步的,因爲你根本沒有使用任何異步函數,即使它是一個回調,你只是將響應傳遞給下一個函數調用,回調本質上不是異步的,異步函數是這樣做的。
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
函數的其餘部分在哪裏?你爲什麼認爲它是異步的? –