0

Von dem, was ich von Promise.all Dokumentation verstehe, ist es möglich, zwei oder mehr Funktionen gleichzeitig auszuführen und warten, bis alle von ihnen abgeschlossen sind. Also habe ich versucht, dieses:So machen Sie Javascript Promise.all Spaß funktioniert gleichzeitig

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

Doch was ich habe (in Chrome ausgeführt wird), war dies:

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

So offenbar nicht nur die Funktionen wurden nicht so gut läuft, wie die then Methode, sie bekam , nicht die Ergebnisse.

Auch wenn ich die Versprechungen der ursprünglichen Funktionen ersetzen ruft ich das gleiche Ergebnis hatte:

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

Der Ausgang war:

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

Also, ich glaube, dass ich die Promise.all Nutzung mißverstanden. Wie führe ich die Parallelverarbeitung mit Promises durch?

Danke,

Rafael Afonso

+0

Es ist möglich, zwei ** asynchrone ** Funktionen gleichzeitig auszuführen und deren Ergebnisse abzuwarten. Ihre Schleifen sind nicht asynchron. – Bergi

+0

Können Sie mir ein Beispiel geben? Möchten Sie sagen, die Versprechen innerhalb der Funktion zu verwenden? –

+2

Er sagt, dass Promises Code nicht asynchron ausführen; Sie führen asynchronen Code aus. Möglicherweise suchen Sie in der Familie [Web Worker] (https://developer.mozilla.org/en/docs/Web/API/Worker) nach etwas für echte Parallelität. – Scott

Antwort

3

Promise.all nimmt Reihe von Versprechungen und löst, sobald alle gelöst sind oder einer von ihnen ablehnt. Aber Versprechen sind nicht asynchron nach Spezifikation, tatsächlich ist das Gegenteil der Fall: Promise executor wird ausgeführt sofort. Wenn also alle Ihre Executoren synchron sind, ist Ihre Versprechungskette synchron.

Vielleicht hilft das ein wenig zu verstehen, wie es funktioniert:

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 

Und das ist die Ausgabe:

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 

Normalerweise werden Promises verwendet, wenn eine asynchrone API aufrufen. Aber wenn Sie Ihr eigenes Javascript asynchron ausführen möchten, müssen Sie Web Workers oder etwas anderes verwenden, abhängig von Ihrer Plattform.

Edit: Einige schnell über Web Workers und Promises googeln, gibt es gut aussehende Bibliothek promise-worker. Mit gut aussehend meine ich, 100% Abdeckung und automatisierte Browser-Tests. Wahrscheinlich lohnt es sich zu inspizieren oder sogar zu installieren, wenn Sie diesen Weg gehen wollen.