Javascript 如何确定回调是同步执行还是异步执行?

Javascript 如何确定回调是同步执行还是异步执行?,javascript,node.js,callback,Javascript,Node.js,Callback,我正在学习node.js。到目前为止,我已经理解了回调的含义,但我不确定回调是同步执行(在回调返回之前,调用方不会继续执行)还是异步执行(调用方进行回调并继续执行其代码)。您可以使用一个标志: var async = false; someFunction(function () { console.log(async ? 'async' : 'sync'); }); async = true; 通过查看函数调用,您无法真正分辨。你需要检查文件,应该在那里注明 通常,您可以通过函数的签

我正在学习node.js。到目前为止,我已经理解了回调的含义,但我不确定回调是同步执行(在回调返回之前,调用方不会继续执行)还是异步执行(调用方进行回调并继续执行其代码)。

您可以使用一个标志:

var async = false;

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

async = true;

通过查看函数调用,您无法真正分辨。你需要检查文件,应该在那里注明


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

我将试着重新表述你的问题,因为“异步函数调用”和“异步IO”术语中有很多混淆

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

答案1:不要试图依赖这个顺序,除非是一个众所周知的带有回调参数的标准函数(数组的forEach、map等、字符串替换器、JSON恢复器)

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


我再重复一遍:如果您需要上面的代码,那么您的设计中有一些错误。您不需要知道“out12vsOut21”顺序,以不依赖于“async or not foo is”的方式构建代码。

好问题,欢迎使用SO:)我在node.jsI的上下文中问过它,我不想使用标志。
var t1 = asyncTestCapture();
foo(function() {
   console.log("Line 1");
});
console.log("Line 2");
var out12vsOut21 = asyncTestVerify(t1);
function asyncTestCapture() {
  return {
    activeHandles:  process._getActiveHandles(),
    activeRequests: process._getActiveRequests()
  };
}

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