这段代码是如何同步的?

时间:2017-08-24 14:15:08

标签: node.js asynchronous

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将使其异步。

2 个答案:

答案 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可以是任何函数,包括匿名函数(你的回调函数)。