2017-08-24 37 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可以是任何功能,包括匿名函数(你的回调)。