如何识别回调是同步还是异步执行?

时间:2014-09-26 09:46:21

标签: javascript node.js callback

我正在学习node.js.到目前为止,我已经理解了回调意味着什么,但我不确定是否将同步执行回调(调用者在回调返回之前不会继续执行)或异步(调用者进行回调并继续执行其代码)。

3 个答案:

答案 0 :(得分:3)

通过查看函数调用,你无法真正说出来。 Some callbacks are asynchronous, others are not。您需要检查文档, 应该在那里说明。

通常你可以通过函数的签名来区分它们。如果预期回调只用计算结果调用一次,并且回调和函数都不返回任何内容,则回调通常是异步调用的(setTimeoutreadFile等) 。如果函数立即返回结果,则通常会同步多次调用回调(Array::sortArray::map)并生成有价值的值。当然,例外证明了这一规则,有时您无法轻易说出,例如: setInterval vs Array::forEach(两者都不返回,并多次调用回调)。

答案 1 :(得分:1)

我会尝试重新解释你的问题,因为“异步函数调用”和“异步IO”术语存在很多混淆。

让我们这样写:给定下面的代码,并且不查看“foo”源代码,我们可以运行一些测试来说明输出是“Line 1 \ nLine2”还是“Line 2 \ nLine1”?

var t1 = asyncTestCapture();
foo(function() {
   console.log("Line 1");
});
console.log("Line 2");
var out12vsOut21 = asyncTestVerify(t1);

答案1:不要试图依赖这个顺序,因为一个众所周知的带有回调参数的标准函数(Array的forEach,map等,String replacer,JSON reviver)

答案2 :(请注意,我非常简短地测试了代码,并且它是node.js特定的,但我相信它可以回答“out12vsOut21”问题。还要注意我正在使用未记录的节点函数)

function asyncTestCapture() {
  return {
    activeHandles:  process._getActiveHandles(),
    activeRequests: process._getActiveRequests()
  };
}

function asyncTestVerify(handles1) {
  var handles2 = asyncTestCapture();
  return handles2.activeHandles === handles1.activeHandles && handles2.activeRequests === handles1.activeRequests
}

我会再说一遍:如果您需要上面的代码,那么您的设计就会出现问题。你不需要知道“out12vsOut21”的顺序,按照它不依赖于“异步或不foo”的方式构建你的代码

答案 2 :(得分:-1)

你可以使用一个标志:

var async = false;

someFunction(function () {
  console.log(async ? 'async' : 'sync');
});

async = true;