0

Promise.all 설명서에서 알 수 있듯이 두 개 이상의 기능을 동시에 실행할 수 있으며 모두 완료 될 때까지 기다릴 수 있습니다. 내가 (크롬에서 실행) 가지고 있었는지, 그러나Javascript Promise.all fun functions 동시에 만드는 방법

function execute(id, max) { 
    console.log('starting ' + id); 

    console.time(id); 
    var sum = 0; 
    for(var i = 0; i < max; i ++) { 
     sum += i; 
    } 
    console.timeEnd(id); 
    return sum; 
} 

console.log("Declaring p1"); 
var p1 = Promise.resolve(() => execute("p1", 10000)); 
console.log("Declaring p2"); 
var p2 = Promise.resolve(() => execute("p2", 100000)); 

console.log("Calling Promise.all"); 
console.time("all"); 
Promise.all([p1, p2]).then((values) => console.log("Then: " + values)); 
console.timeEnd("all"); 

이 : 그래서 나는이 시도

Declaring p1 
Declaring p2 
Calling Promise.all 
all: 0.599ms 
Then:() => execute("p1", 10000),() => execute("p2", 100000) 

그래서 분명히, then 방법을 가지고로서뿐만 아니라 기능도 실행되지 않았다 결과가 아닙니다.

function execute(id, max) { 
    console.log('starting ' + id); 

    console.time(id); 
    var sum = 0; 
    for(var i = 0; i < max; i ++) { 
     sum += i; 
    } 
    console.timeEnd(id); 
    return sum; 
} 

console.log("Calling Promise.all"); 
console.time("all"); 
Promise.all([() => execute("p1", 10000),() => execute("p2", 100000)]) 
    .then((values) => console.log("Then: " + values)); 
console.timeEnd("all"); 

출력했다 :

Calling Promise.all 
all: 0.274ms 
Then:() => execute("p1", 10000),() => execute("p2", 100000) 

그래서, 나는 내가 Promise.all 사용을 오해 생각 나는 원래 기능에 의해 약속을 교체하더라도

내가 같은 결과를 가지고 호출합니다. 약속을 사용하여 병렬 처리를 실행하려면 어떻게해야합니까?

감사합니다,

라파엘 아폰소

+0

두 개의 ** 비동기 ** 기능을 동시에 실행할 수 있으며 그 결과를 기다리고 있습니다. 루프는 비동기 적이 지 않습니다. – Bergi

+0

예를 들어 주시겠습니까? 함수 내에서 약속을 사용한다고 말하고 싶습니까? –

+2

그는 약속이 비동기 적으로 코드를 실행하지 않는다고 말합니다. 비동기 코드를 실행합니다. 진정한 병렬 처리를 위해 [Web Worker] (https://developer.mozilla.org/en/docs/Web/API/Worker) 패밀리에서 뭔가를 찾고있을 수 있습니다. – Scott

답변

3

Promise.all는 약속의 배열을 모두 해결 또는 그 중 하나가 거부 되 자마자 해결합니다. 그러나 약속은 사양에 의해 비동기 적이 지 않습니다. 실제로는 반대로 Promise executor이 실행됩니다. 은 즉시입니다. 따라서 모든 집행자가 동기식이면 약속 체인은 동기식입니다.

은 어쩌면 어떻게 작동하는지 이해하는 데 조금 도움이 :

function execute(id, max) { 
    console.log('starting ' + id); 

    console.time(id); 
    var sum = 0; 
    for(var i = 0; i < max; i ++) { 
     sum += i; 
    } 
    console.timeEnd(id); 
    return sum; 
} 

console.log("Declaring p1"); 
var p1 = Promise.resolve(execute(1, 10)); 

console.log("Declaring p2"); 
var p2 = new Promise((resolve, reject) => { 
    console.log('setting timeout..'); 
    setTimeout(() => resolve(execute(2,10)), 2000); 
}) 

console.log("Calling Promise.all"); 
console.time("all"); 
console.time('results'); 
Promise.all([p1,p2]) 
    .then((results) => { 
     console.log('all results', results); 
     console.timeEnd('results'); 
    }) 
    .catch(console.error.bind(console)); 

console.timeEnd("all"); // Promise.all returns immediately 

을 그리고 출력 이잖아 :

Declaring p1 
starting 1 
1: 0.016ms 
Declaring p2 
setting timeout.. 
Calling Promise.all 
all: 0.097ms 
starting 2 
2: 0.002ms 
all results [45, 45] 
results: 2001.144ms 

일부 비동기 API를 호출 할 때 보통 약속이 사용됩니다. 그러나 자신의 JavaScript를 비동기 적으로 실행하려면 플랫폼에 따라 Web Workers 등을 사용해야합니다.

편집 : 웹 근로자와 약속에 대해 빠르게 검색하면 멋진 도서관 promise-worker이 있습니다. 잘 보시면 100 % 적용 범위와 자동화 된 브라우저 테스트를 의미합니다. 아마 당신이 그 길을 가고 싶다면 아마도 검사 할 가치가 있거나 심지어 설치까지 할 가치가있을 것입니다.