JavaScript,Node.js : is Array. forEach 异步?

标签 javascript arrays asynchronous foreach node.js

我有一个关于 JavaScript 的原生 Array.forEach 实现的问题:它的行为是异步的吗? 例如,如果我调用:

[many many elements].forEach(function () {lots of work to do})

这会是非阻塞的吗?

最佳答案

不,它正在阻塞。看看specification of the algorithm .

然而,MDN 上给出了一个可能更容易理解的实现。 :

if (!Array.prototype.forEach)
{
  Array.prototype.forEach = function(fun /*, thisp */)
  {
    "use strict";

    if (this === void 0 || this === null)
      throw new TypeError();

    var t = Object(this);
    var len = t.length >>> 0;
    if (typeof fun !== "function")
      throw new TypeError();

    var thisp = arguments[1];
    for (var i = 0; i < len; i++)
    {
      if (i in t)
        fun.call(thisp, t[i], i, t);
    }
  };
}

如果您必须为每个元素执行大量代码,则应考虑使用不同的方法:

function processArray(items, process) {
    var todo = items.concat();

    setTimeout(function() {
        process(todo.shift());
        if(todo.length > 0) {
            setTimeout(arguments.callee, 25);
        }
    }, 25);
}

然后调用它:

processArray([many many elements], function () {lots of work to do});

这将是非阻塞的。示例取自 High Performance JavaScript .

另一个选项可能是 web workers .

关于JavaScript,Node.js : is Array. forEach 异步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5050265/

相关文章:

node.js - 将函数作为单独的 node.js 进程运行?

node.js - 将 API 所需的回调 hell 转换为同步样式

javascript - WordPress 和插件

php - 递归合并同类索引

javascript - 回调引用和继承javascript

java - 在 main 方法中输入数组的困惑

javascript - 在 anchor 和 img 标签之间插入元素

javascript - eval 不起作用,但 JSON.parse 可以

c# - 聊天 - 获取新消息可用性的最佳方式

smembers 的 node.js 异步 mapSeries