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

Wie löst man JavaScript-Versprechen nacheinander auf?

Linda Hamilton
Linda HamiltonOriginal
2024-12-13 17:49:15932Durchsuche

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!
  });
};

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!

Stellungnahme:
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