node.js中的forEach是同步还是异步
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了node.js中的forEach是同步还是异步相关的知识,希望对你有一定的参考价值。
参考技术Anode里几乎所有用到回调函数的地方,都是异步的,回调函数后面的代码很可能比回调函数中的代码后先执行,特别是数据库操作。当然,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。您需要查看文档,它将应该在那里说明。
您通常可以通过函数的签名将它们区分开来。如果一个回调预计只在计算结果中被调用一次,并且回调和函数都不返回任何内容,则通常会异步调用回调(setTimeout
、readFile
等)。如果函数立即返回结果,通常会同步调用多次回调(Array::sort
、Array::map
)并产生有价值的值。当然,例外证明了规则,有时您无法轻易分辨,例如setInterval
与 Array::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是同步还是异步的主要内容,如果未能解决你的问题,请参考以下文章