2017-10-22 3 views
0

Ich habe Code entwickelt, um Operationen durch Erstellen von 5 Web Worker durchzuführen. Ich sende einfach Ganzzahlen an Web-Arbeiter, um eine Summe zu generieren und ein JSON-Objekt zurückzugeben. Ich dränge dieses Ergebnis in ein Array. Dieses Array wird im lokalen Speicher gespeichert, sobald alle Web-Worker ihre Aufgabe abgeschlossen haben. Das Problem besteht darin, dass im lokalen Speicher gespeicherte Arrays die Werte nicht in der Reihenfolge speichern, die von jedem Web Worker zurückgegeben wird. Wenn der Web-Worker den Wert zuerst zurückgegeben hat, muss das Array seinen Wert bei Null enthalten, was bedeutet, dass die asynchrone Operation nicht erfüllt ist. Wie gehe ich dabei vor?Async Push-Daten in Array als Web-Worker gibt Ergebnis

Hier ist mein Code für Js-Datei:

 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); 
} 

// Mein Code für Web-worker.js

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}); 

};

enter image description here

enter image description here

Im Bild Arbeiter 0 zurückgegebene Ergebnis zuerst so seine Daten auf dem zweiten Array-Index von im lokalen Speicher gespeichert werden sollen, ist es aber nicht.

+0

Ich denke, das sind die Ergebnisse von zwei verschiedenen Läufen. Dies kann nicht passieren –

Antwort

0

ihre id Verwendung als Offset (um die Ergebnisse nach bekommen sortiert, wenn sie gestartet wurden):

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

gibt es eine andere Möglichkeit, es asynchron zu tun. – Rahila

+0

@rahila eher ein paar tausend. Es ist eigentlich die Frage, welche Reihenfolge du suchst ... –

+0

Ich möchte meinen Code übersetzen, was bedeutet, dass Ergebnisse gespeichert werden, sobald der Arbeiter die Summe zurückgibt. – Rahila

0

Sie await Promise.all([someCall(), anotherCall()]) nutzen könnten. Sie erhalten Ihre Ergebnisse in der richtigen Reihenfolge. (Wenn Sie Ihren Code transpilieren)