2017-10-22 18 views
0

5人のWebワーカーを作成して操作を実行するコードを開発しました。私は単にWebワーカーに整数を送り、合計を生成してjsonオブジェクトを返すだけです。私はその結果を配列にプッシュしています。この配列は、すべてのWebワーカーが作業を完了したらローカルストレージに格納されます。ローカルストレージに格納された配列は、各Webワーカーから返された順序で値を格納しません。 Webワーカーが最初に値を返した場合、配列の値はゼロインデックスに含まれている必要があります。つまり、非同期操作が満たされていないことを意味します。これをどうやって行うのですか?ここでasync Webワーカーとしてデータを配列にプッシュする結果

は.jsファイルのための私のコードです:

 window.onload = init; 
    var running = 0; 
    var arr=[1,1001,2001,3001,4001]; 
    var sec=[1000,2000,3000,4000,5000] 
    var results=[]; 
    function init() { 

     sendworker(); 
    } 


    function sendworker() 
    { 

    var n, worker; 
    display("Starting workers..."); 

    for (n = 0; n <5; ++n) { 
    workers = new Worker("jsonWorker.js"); 
    workers.onmessage = workerDone; 
    workers.postMessage({id: n, start: arr[n],end:sec[n]}); 
    ++running; 

    } 

} 

    function workerDone(e) { 
    --running; 
    display("Worker " + e.data.id + " is done, sum of integers between: "+e.data.start+ "&"+e.data.end+"=" + e.data.sum); 
    results.push(e.data.sum); 

    if (running === 0) { // <== There is no race condition here, see below 
     display("All workers complete"); 
     window.localStorage.setItem("Results", JSON.stringify(results)); 

    } 
} 

function display(msg) { 
    var p = document.createElement('p'); 
    p.innerHTML = String(msg); 
    document.body.appendChild(p); 
} 

//ウェブのための私のコードは

this.onmessage = function(e) { 
    var data = e.data; 
    var a=data.start; 
    var b=data.end; 
    var c=0; 
    for (var i=a; i<= b; i++) { 

    c=c+i; 

    } 
    this.postMessage({id: e.data.id,start:a,end:b,sum: c}); 

を} worker.js。画像ワーカー0で

enter image description here

enter image description here

そのデータをローカルストレージに格納された配列の第2のインデックスになければならないので、最初の結果を戻したが、それはありません。オフセットとして

+0

私はこれらが2つの異なる実行の結果だと思います。これは起こることができません –

答えて

0

は(それらが開始されたときの結果は、後にソートを取得するために)自分のIDを使用します。

results[e.data.id] = e.data.sum; 
+0

は、非同期的にそれを行う他の方法があります。 – Rahila

+0

@rahilaではなく、数千。その実際にあなたが探している注文の質問... –

+0

私は、労働者が合計を返すとすぐに店舗の結果を意味する私のコードを翻訳したいと思います。 – Rahila

0

あなたはawait Promise.all([someCall(), anotherCall()])を使用することができます。 正しい結果が得られます。 (コードを翻訳している場合)

関連する問題