如何确定一个callback将被同步执行还是asynchronous执行?

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

你不能通过查看函数调用来判断。 有些callback是asynchronous的,有些则不是 。 你将需要检查文档,它应该在那里陈述。

通常您可以通过函数的签名来区分它们。 如果一个callback只要计算结果被调用一次,callback函数和函数都不返回任何东西,callback通常是asynchronous调用的( setTimeoutreadFile等)。 如果函数立即返回结果,则通常会同步调用多次( Array::sortArray::map )并生成有价值的值。 当然,exceptioncertificate规则,有时你不能轻易说出,例如setIntervalArray::forEach (都不返回任何内容,并且多次调用callback函数)。

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

让我们这样写:给定代码下面,而不看“富”源代码,我们可以运行一些testing,说如果输出将是“线1 \ nLine2”或“线2 \ nLine1”?

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

回答编号1:不要试图依赖这个命令,除了一个众所周知的带有callback参数的标准函数(Array的forEach,map等,Stringreplace器,JSON reviver)

答案2:(注意,我testing的代码非常简短,它是node.js特定的,但我相信它可以回答“out12vsOut21”的问题。另外请注意,我正在使用未logging的节点函数)

 function asyncTestCapture() { return { activeHandles: process._getActiveHandles(), activeRequests: process._getActiveRequests() }; } function asyncTestVerify(handles1) { var handles2 = asyncTestCapture(); return handles2.activeHandles === handles1.activeHandles && handles2.activeRequests === handles1.activeRequests } 

我再重复一遍:如果你需要上面的代码,那么在你的devise中是有问题的。 你不需要知道“out12vsOut21”的顺序,以不依赖于“async or not foo is”的方式构build你的代码。

你可以使用一个标志:

 var async = false; someFunction(function () { console.log(async ? 'async' : 'sync'); }); async = true;