开发者社区> 问答> 正文

JavaScript,Node.js:Array.forEach是否异步?

我Array.forEach对JavaScript 的本机实现有疑问:它是否异步运行?例如,如果我打电话:

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

这将是非阻塞的吗?

展开
收起
保持可爱mmm 2020-01-15 10:18:52 447 0
1 条回答
写回答
取消 提交回答
  • 不,它正在阻止。看一下算法的规格。

    但是,在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。

    另一个选择可能是网络工作者。 问题来源于stack overflow

    2020-01-15 10:19:12
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
JavaScript异步编程 立即下载
Delivering Javascript to World 立即下载
编程语言如何演化-以JS的private为例 立即下载