Rumah >hujung hadapan web >tutorial js >Bagaimana untuk Menyelesaikan Janji JavaScript Secara Berurutan?

Bagaimana untuk Menyelesaikan Janji JavaScript Secara Berurutan?

Linda Hamilton
Linda Hamiltonasal
2024-12-13 17:49:15932semak imbas

How to Resolve JavaScript Promises Sequentially?

​​​​​​​Selesaikan Janji Secara Berurutan

Janji ialah cara biasa untuk mengendalikan operasi tak segerak dalam JavaScript. Walau bagaimanapun, adalah sukar untuk mengawal susunan janji diselesaikan.

Masalahnya:

Pertimbangkan kod berikut yang membaca satu siri fail secara bersiri:

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

Kod ini menggunakan rekursi untuk membaca fail satu demi satu, tetapi ia mungkin mencabar untuk berfungsi dengan.

Elakkan Rekursi dengan Async/Await:

Dalam JavaScript moden, menggunakan fungsi async dan await ialah penyelesaian yang lebih elegan:

async function readFiles(files) {
  for(const file of files) {
    await readFile(file);
  }
};

Sebagai alternatif, Gunakan Iterator:

Penjana Async sediakan pendekatan alternatif untuk membaca fail secara berurutan:

async function* readFiles(files) {
  for(const file of files) {
    yield await readFile(file);
  }
};

Pertimbangkan Gelung Mudah:

Jika anda lebih suka pendekatan yang lebih mudah, asas untuk gelung sudah memadai:

var readFiles = function(files) {
  var p = Promise.resolve(); // Q() in q

  files.forEach(file =>
      p = p.then(() => readFile(file)); 
  );
  return p;
};

Atau, Gunakan Janji Pengurangan:

Penyelesaian yang lebih padat menggunakan pengurangan:

var readFiles = function(files) {
  return files.reduce((p, file) => {
     return p.then(() => readFile(file));
  }, Promise.resolve()); // initial
};

Kaedah Utiliti Perpustakaan

Perpustakaan janji tertentu (mis., Bluebird) menyediakan kaedah utiliti yang disesuaikan untuk tujuan ini:

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

Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Janji JavaScript Secara Berurutan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn