0

可能であるかどうか、クライアント側で複数のJavaScript関数を別々に実行できることを知りたいときがあります。互いに干渉することなく、JavaScriptで複数の非同期関数を順不同で実行するにはどうすればよいですか?

できない場合は回避策がありますか?

+0

まずjavascriptのための一つのスレッドだけがブラウザにあり。したがって、setTimeoutを使用して複数の関数を実行できますが、ラウンドロビン方式で実行されます。 1つずつ –

+2

@DominiqueFortin:1つのメインスレッド(必要な数のWebワーカー)。 –

+0

Webワーカーを使用して関数を実行することは可能ですか? – 0x01Brain

答えて

4

の順番どおりに実行したいと思ったら、その通りです(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"}); 
    } 
}); 
関連する問題