0
可能であるかどうか、クライアント側で複数のJavaScript関数を別々に実行できることを知りたいときがあります。互いに干渉することなく、JavaScriptで複数の非同期関数を順不同で実行するにはどうすればよいですか?
できない場合は回避策がありますか?
可能であるかどうか、クライアント側で複数のJavaScript関数を別々に実行できることを知りたいときがあります。互いに干渉することなく、JavaScriptで複数の非同期関数を順不同で実行するにはどうすればよいですか?
できない場合は回避策がありますか?
の順番どおりに実行したいと思ったら、その通りです(setTimeout
など)。彼らがajaxの完了などを待っているようなことをしている場合、彼らはお互いに干渉することはありません。しかし、彼らがJavaScriptコードの作業をやっているのであれば、彼らは実際に動いたときにメインUIスレッドをビジー状態に保ちます。
JavaScriptの処理が大変で、メインのUIスレッドを使用可能にして、UIが応答するようにしたい場合は、処理をメインUIスレッドとは別のスレッドで同時に実行するweb workersにオフロードできます。
ここで(my answer hereから)単純なWebワーカー例です:
メインのJSファイル:
function order(number) {
var w = new Worker("worker.js");
w.addEventListener("message", function(e) {
if (e.data && e.data.command == "log") {
console.log(e.data.message);
}
w = null;
});
console.log("Queuing order: " + number);
w.postMessage({command: "go", order: number});
}
function takeOrder(number, cb) {
console.log("Preparing order: " + number + "");
cb(number); // Call the callback
}
console.log("Starting to accept order");
for (var i = 0; i < 3; i++) {
console.log("Taking order: " + i);
takeOrder(i, order); // Pass order as the callback
}
console.log("Job completed!");
worker.js
は:
self.addEventListener("message", function(e) {
if (e.data && e.data.command == "go") {
for (var i = 0; i < 1000000000; i++); // kill time
self.postMessage({command: "log", message: "Order: " + e.data.order + " completed"});
}
});
まずjavascriptのための一つのスレッドだけがブラウザにあり。したがって、setTimeoutを使用して複数の関数を実行できますが、ラウンドロビン方式で実行されます。 1つずつ –
@DominiqueFortin:1つのメインスレッド(必要な数のWebワーカー)。 –
Webワーカーを使用して関数を実行することは可能ですか? – 0x01Brain