Rumah >hujung hadapan web >tutorial js >Bagaimana untuk Menyelesaikan Janji JavaScript 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!