2017-08-24 90 views
2
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將使其異步。這段代碼是如何同步的?

+1

實際上難以正確格式化和縮進代碼嗎? – 2017-08-24 14:29:37

+0

函數的其餘部分在哪裏?你爲什麼認爲它是異步的? –

回答

0

這段代碼是同步的,因爲你根本沒有使用任何異步函數,即使它是一個回調,你只是將響應傳遞給下一個函數調用,回調本質上不是異步的,異步函數是這樣做的。

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

0

在函數中調用回調的事實不是異步的。我敢肯定你寫這樣的代碼:

function B() { 
    return 1; 
} 

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

如果你認爲,這無異於:

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

哪裏B可以是任何功能,包括匿名函數(你的回調)。