使用forEach时,与node.js异步流混淆。

时间:2015-03-23 09:33:05

标签: node.js asynchronous

我在node.js中编码了6个月。我已经阅读过异步编码,事件循环和回调等概念。我知道"在执行同步代码堆栈时,异步代码永远不会执行。这就是node.js是单线程"的含义。但这是一个例子

var a = [4, 5, 6, 7];
var results = [];

a.forEach(function(result){
  results.push(result + 1);
});

console.log(results);

据我所知,函数forEach的参数是回调,后者在同步块完成执行后调用。这意味着我希望结果将是

[]

但实际上是

[5, 6 ,7, 8]

为什么会这样?是forEach同步吗?或者我错过了什么?据我了解,

console.log(results)

将数据推入之前执行。

2 个答案:

答案 0 :(得分:4)

传递给Array.prototype.forEach()的回调是同步的。因此,它阻止执行线程,直到它完成将函数应用于数组的所有成员。

如果您想进一步研究JavaScript的异步特性,我还设法找到一些有趣的读物:

答案 1 :(得分:2)

某些功能是同步的,其他功能是异步的。实际上,Array.forEach方法和所有基本功能都是同步的。 如果你想异步操作数组,你有两个选择:在forEach中调用函数但你不知道它何时完成,或者使用async library

第一种方法:

var a = [4, 5, 6, 7];
var results = [];

a.forEach(function(result){
  (function(i){
    results.push(i);
  }(result+1));
});

console.log(results);

使用async.js:

var async = require('async');
var a = [4, 5, 6, 7];
var results = [];

async.eachSeries(a, function(result, done) {
  results.push(result+1);
  done();
}, function () {
  console.log('forEach finished');
});
console.log(results);