JavaScript のネイティブ実装に関して質問がありますArray.forEach
。非同期で動作しますか? たとえば、次のように呼び出した場合:
[many many elements].forEach(function () {lots of work to do})
これは非ブロッキングでしょうか?
ベストアンサー1
いいえ、ブロックしています。アルゴリズムの仕様。
しかし、おそらくもっと分かりやすい実装が翻訳:
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});
これは非ブロッキングになります。例は以下から引用されています。高性能JavaScript。
もう一つの選択肢はウェブワーカー。