我在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)
将数据推入之前执行。
答案 0 :(得分:4)
传递给Array.prototype.forEach()
的回调是同步的。因此,它阻止执行线程,直到它完成将函数应用于数组的所有成员。
如果您想进一步研究JavaScript的异步特性,我还设法找到一些有趣的读物:
JavaScript, Node.js: is Array.forEach asynchronous?
此主题解决了您当前面临的相同情况
它还提供了Array.prototype.forEach()
Are all javascript callbacks asynchronous? If not, how do I know which are?
答案 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);