2017-10-22 3 views
0

5 명의 웹 작업자를 생성하여 작업을 수행하는 코드를 개발했습니다. 나는 웹 근로자에게 정수를 보내서 합을 생성하고 json 객체를 반환합니다. 나는 그 결과를 배열에 넣고있다. 이 배열은 모든 웹 작업자가 작업을 완료 한 후 로컬 저장소에 저장됩니다. 문제는 로컬 저장소에 저장된 배열이 각 웹 작업자가 반환 한 순서대로 값을 저장하지 않는다는 것입니다. 웹 작업자가 먼저 값을 반환 한 경우 배열의 값이 0 인덱스에 있어야하므로 비동기 작업이 충족되지 않습니다. 어떻게해야합니까?비동기 웹 작업자가 결과로 배열로 데이터를 푸시합니다.

여기의 .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

먼저 결과를 반환하지만 아니다. 오프셋으로

+0

나는 두 개의 다른 실행 결과라고 생각합니다. 이것은 –

답변

0

는 (결과가 시작된 때 이후에 정리 될하기 위해) 자신의 ID를 사용하여 당신은 await Promise.all([someCall(), anotherCall()])을 사용할 수

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

에 비동기 적으로 수행 할 수있는 다른 방법이 있습니다. – Rahila

+0

@rahila 오히려 수천. 그게 실제로 당신이 찾고있는 순서에 대한 질문 ... –

+0

나는 노동자가 합계를 반환하자마자 상점 결과를 의미하는 내 코드를 번역하고 싶습니다. – Rahila

0

. 결과가 올바른 순서로 전달됩니다. (코드를 번역하는 경우)