Heim > Web-Frontend > js-Tutorial > Wie löst man JavaScript-Versprechen nacheinander auf?

Wie löst man JavaScript-Versprechen nacheinander auf?

Linda Hamilton
Freigeben: 2024-12-13 17:49:15
Original
946 Leute haben es durchsucht

How to Resolve JavaScript Promises Sequentially?

​​​​​​Promises nacheinander auflösen

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!
  });
};
Nach dem Login kopieren

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);
  }
};
Nach dem Login kopieren

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);
  }
};
Nach dem Login kopieren

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;
};
Nach dem Login kopieren

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
};
Nach dem Login kopieren

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.
});
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage