Parallele Vorgänge mit Versprechen.alle?
Ich bin zu der Annahme geführt, dass Versprechen.alle führt alle Funktionen, die Sie übergeben, die parallel und kümmert sich nicht, was um die zurückgegebenen verspricht fertig stellen.
Aber wenn ich Schreibe diesen test-code:
function Promise1(){
return new Promise(function(resolve, reject){
for(let i = 0; i < 10; i++){
console.log("Done Err!");
}
resolve(true)
})
}
function Promise2(){
return new Promise(function(resolve, reject){
for(let i = 0; i < 10; i++){
console.log("Done True!");
}
resolve(true)
})
}
Promise.all([
Promise1(),
Promise2()
])
.then(function(){
console.log("All Done!")
})
Den Ergebnissen, die ich bekommen, ist dies
Done Err!
Done Err!
Done Err!
Done Err!
Done Err!
Done Err!
Done Err!
Done Err!
Done Err!
Done Err!
Done True!
Done True!
Done True!
Done True!
Done True!
Done True!
Done True!
Done True!
Done True!
Done True!
Done!
Aber wenn Sie parallel laufen, würde ich nicht erwarten, dass Sie die zur gleichen Zeit ausführen und geben Sie mir ein Ergebnis wie dieses?
Done Err!
Done True!
Done Err!
Done True!
Done Err!
Done True!
Done Err!
Done True!
Etc. Etc.?
Oder bin ich etwas fehlt in der Art, wie ich bin, es zu tun?
Das Versprechen Körper synchron ausgewertet.
Also, wenn eines der Versprechen wurden zu gehen und bekommen etwas aus einer Datenbank und anderen waren, sagen, abrufen von Daten aus einer web-API, die es tun würde, asynchron, aber alles, was ich gesagt, es zu drucken auf dem Bildschirm geschieht in der Reihenfolge, die ich angegeben in dem array?
Es hat nichts zu tun mit
Hier ein Beispiel, wie
Mögliche Duplikate von Node.js native Versprechen.alle Verarbeitungen parallel oder sequentiell?. Beachten Sie, dass ein Versprechen nicht machen, ein synchron-loop "parallel" oder "asynchrone" von sich, es hilft nur zum darstellen eines bereits asynchrone Sache (wie Datenbank-Abfragen, web-api-Aufrufe oder timeouts).
Also, wenn eines der Versprechen wurden zu gehen und bekommen etwas aus einer Datenbank und anderen waren, sagen, abrufen von Daten aus einer web-API, die es tun würde, asynchron, aber alles, was ich gesagt, es zu drucken auf dem Bildschirm geschieht in der Reihenfolge, die ich angegeben in dem array?
Es hat nichts zu tun mit
Promise.all
. Wenn Sie erstellen ein Versprechen, das der Funktion übergeben wird sofort ausgewertet, so dass der Körper von Promise1
ausgeführt wird, bevor Sie überhaupt anrufen Promise2
oder Promise.all
. Javascript ist nicht multi-threaded, so dass Sie Ihre for
Schleifen wird niemals überschneiden mögen.Hier ein Beispiel, wie
Promise.all
funktioniert. Das verspricht der start in der Reihenfolge, wie Sie entstanden sind, aber Sie laufen parallel.Mögliche Duplikate von Node.js native Versprechen.alle Verarbeitungen parallel oder sequentiell?. Beachten Sie, dass ein Versprechen nicht machen, ein synchron-loop "parallel" oder "asynchrone" von sich, es hilft nur zum darstellen eines bereits asynchrone Sache (wie Datenbank-Abfragen, web-api-Aufrufe oder timeouts).
InformationsquelleAutor Steve | 2017-03-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist, weil Ihre Versprechungen sind blockierend und synchron! Versuchen Sie, etwas mit einem timeout-statt einer synchronen Schleife:
javascript ist single-threaded. Ihre cpu-Anzahl spielt keine Rolle, und selbst dann ist ein synchroner Vorgang kann nur ausgeführt werden in einer cpu.
InformationsquelleAutor Johannes Merz
Nicht-Async-Körper ist Seriell ausgeführt
Der moment, den Sie erreichen einen Asynchronen Aufruf innerhalb Ihres Körpers (Ex. Schlagen Sie eine URL), die Anderen Versprechen in das array ausführen.
InformationsquelleAutor Sanket Berde