Hướng dẫn chạy tuần tự mảng promise

Hi, lại là em đây ạ :sweat_smile:

Đây là đoạn code chạy đồng thời mảng promise :

const insertDatabase=value=>new Promise(resolve=>setTimeout(_=>resolve("Done!"),3000));
const array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
Promise.all(array.map(value => insertDatabase(value)))

Bây giờ em có một mảng task số lượng bất kỳ, em muốn chạy tuần tự từng promise một bởi vì kết quả promise trước làm đối số cho promise sau. Nếu biết trước số lượng promise chỉ định thì có thể dùng promise chain với .then().then().then().then().then().then()… dài ngoằn, nhưng em muốn dùng for loop hoặc while cho các promise chạy tuần tự thì làm sao vậy các anh/chị? Em cảm ơn.

Ví dụ:

 const asyncDouble=value=>new Promise(resolve=>setTimeout(_=>resolve(value*2)));
 const array = [];
 for (let i = 1; i < 4; i++) {
     // chạy TUẦN TỰ từng promise
     // array.push(asyncDouble(kết quả promise trước); ? 🤔
 }
 console.log(array) // [2,4,16]

Kết quả mong muốn array = [2,4,8];

  • promise 1 chạy xong trả về 2.
  • Lấy 2 làm đối số cho promise thứ 2 rồi được trả về 4.
  • tiếp tục 4 * 2 = 8.

Sorry nếu ví dụ không thực tế, nhưng anh/chị hiểu ý em mà phải không :sob:?!
Không biết có cú pháp nào hỗ trợ sẵn không ạ hay phải tạo một design pattern riêng để xử lý?

Em đã thực hiện bằng await rồi ạ.

const asyncDouble = value => new Promise(resolve => setTimeout(_ => resolve(value * 2)));
const array = [];

(async _ => {
    let temp = 0;
    for (let i = 1; i < 4; i++) {
        if (i == 1) {
            temp = await asyncDouble(1);
        } else {
            temp = await asyncDouble(temp);
        }
        array.push(temp);
    }
    console.log(array) // [2,4,8]
})();
2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?