node.js中的forEach是同步还是异步

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了node.js中的forEach是同步还是异步相关的知识,希望对你有一定的参考价值。

参考技术A
node里几乎所有用到回调函数的地方,都是异步的,回调函数后面的代码很可能比回调函数中的代码后先执行,特别是数据库操作。当然,node也提供了同步版本的函数,例如文件操作,fs.readFileSync()是fs.readFile()的同步版本。
那么问题来了,forEach()是不是异步的呢?按理说,没有加Sync,应该是异步的呀。
复制代码
代码如下:
var
arr
=
['a',
'b',
'c'];
var
str
=
'123';
arr.forEach(function(item)

str
+=
item;
while
(true)
;
//用一个死循环,卡死它~~
);
console.log(str);
运行上面的代码,结果它就这么卡死了,没有任何输出。。
所以说,node里的forEach()是同步的!!
第一次用node的时候,没有考虑过这个问题,按同步的写了,写突然想到,测试后虚惊一场,以为以前的代码都写错了。

如何识别回调是同步执行还是异步执行? [复制]

【中文标题】如何识别回调是同步执行还是异步执行? [复制]【英文标题】:How to identify if a callback is going to be executed synchronously or asynchronously? [duplicate] 【发布时间】:2014-11-21 07:01:27 【问题描述】:

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

【问题讨论】:

好问题,欢迎来到 SO :) 我是在 node.js 的上下文中问的 【参考方案1】:

您无法通过查看函数调用来判断。 Some callbacks are asynchronous, others are not。您需要查看文档,它应该在那里说明。

您通常可以通过函数的签名将它们区分开来。如果一个回调预计只在计算结果中被调用一次,并且回调和函数都不返回任何内容,则通常会异步调用回调(setTimeoutreadFile 等)。如果函数立即返回结果,通常会同步调用多次回调(Array::sortArray::map)并产生有价值的值。当然,例外证明了规则,有时您无法轻易分辨,例如setIntervalArray::forEach(均不返回任何内容,并多次调用回调)。

【讨论】:

【参考方案2】:

我会尝试重新表述您的问题,因为“异步函数调用”和“异步 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:不要试图依赖这个顺序,除了带有回调参数的众所周知的标准函数(数组的 forEach、map 等、字符串替换器、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”的顺序,构建你的代码不依赖于“async or not foo is”

【讨论】:

【参考方案3】:

您可以为此使用标志:

var async = false;

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

async = true;

【讨论】:

我不想使用标志。

以上是关于node.js中的forEach是同步还是异步的主要内容,如果未能解决你的问题,请参考以下文章

node.js中的forEach是同步还是异步

node.js中的forEach是同步还是异步

node.js里的forEach也是异步的吗

node.js 中的 foreach 异步函数

node.js 中的回调是始终异步还是始终同步?或者它们可以是“有时是一个,有时是另一个”?

Node js中Promise是同步还是异步