Heim >Web-Frontend >js-Tutorial >Wie löst man JavaScript-Versprechen nacheinander auf?
Promises sind eine gängige Methode zur Handhabung asynchroner Vorgänge in JavaScript. Es kann jedoch schwierig sein, die Reihenfolge zu kontrollieren, in der Versprechen gelöst werden.
Das Problem:
Betrachten Sie den folgenden Code, der eine Reihe von Dateien seriell liest:
var readFile = function(file) { ... // Returns a promise. }; var readFiles = function(files) { return new Promise((resolve, reject) => { var readSequential = function(index) { if (index >= files.length) { resolve(); } else { readFile(files[index]).then(function() { readSequential(index + 1); }).catch(reject); } }; readSequential(0); // Start with the first file! }); };
Dieser Code verwendet Rekursion, um die Dateien nacheinander zu lesen, aber die Arbeit kann schwierig sein mit.
Rekursion mit Async/Await vermeiden:
In modernem JavaScript ist die Verwendung von Async-Funktionen und Wait eine elegantere Lösung:
async function readFiles(files) { for(const file of files) { await readFile(file); } };
Alternativ können Sie Iteratoren verwenden:
Asynchrone Generatoren bieten einen alternativen Ansatz zum sequentiellen Lesen von Dateien:
async function* readFiles(files) { for(const file of files) { yield await readFile(file); } };
Stellen Sie sich eine einfache Schleife vor:
Wenn Sie einen einfacheren Ansatz bevorzugen, kann eine einfache for-Schleife ausreichen:
var readFiles = function(files) { var p = Promise.resolve(); // Q() in q files.forEach(file => p = p.then(() => readFile(file)); ); return p; };
Oder nutzen Sie Promise Reduction:
Eine kompaktere Variante Lösung mit Reduzieren:
var readFiles = function(files) { return files.reduce((p, file) => { return p.then(() => readFile(file)); }, Promise.resolve()); // initial };
Bibliotheksdienstprogrammmethoden
Bestimmte Versprechensbibliotheken (z. B. Bluebird) bieten für diesen Zweck maßgeschneiderte Dienstprogrammmethoden:
var Promise = require("bluebird"); var fs = Promise.promisifyAll(require("fs")); var readAll = Promise.resolve(files).map(fs.readFileAsync,{concurrency: 1 }); // if the order matters, you can use Promise.each instead and omit concurrency param readAll.then(function(allFileContents){ // do stuff to read files. });
Das obige ist der detaillierte Inhalt vonWie löst man JavaScript-Versprechen nacheinander auf?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!