我Array.forEach对JavaScript 的本机实现有疑问:它是否异步运行?例如,如果我打电话:
[many many elements].forEach(function () {lots of work to do})
这将是非阻塞的吗?
不,它正在阻止。看一下算法的规格。
但是,在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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。