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});
};
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.
Ich denke, das sind die Ergebnisse von zwei verschiedenen Läufen. Dies kann nicht passieren –