ดังที่คำตอบก่อนหน้านี้ได้ระบุไว้แล้วPromise.all
รวมค่าที่แก้ไขทั้งหมดด้วยอาร์เรย์ที่สอดคล้องกับคำสั่งซื้อของสัญญาเดิม (ดูที่สัญญารวม )
อย่างไรก็ตามฉันอยากจะชี้ให้เห็นว่าคำสั่งซื้อจะถูกเก็บไว้ในฝั่งลูกค้าเท่านั้น!
สำหรับนักพัฒนาดูเหมือนว่าสัญญาได้รับการเติมเต็มตามลำดับ แต่ในความเป็นจริงสัญญาจะประมวลผลด้วยความเร็วที่แตกต่างกัน สิ่งนี้เป็นสิ่งสำคัญที่ต้องรู้เมื่อคุณทำงานกับแบ็กเอนด์ระยะไกลเพราะแบ็กเอนด์อาจได้รับสัญญาของคุณในลำดับที่แตกต่างกัน
นี่คือตัวอย่างที่แสดงให้เห็นถึงปัญหาโดยใช้หมดเวลา:
Promise.all
const myPromises = [
new Promise((resolve) => setTimeout(() => {resolve('A (slow)'); console.log('A (slow)')}, 1000)),
new Promise((resolve) => setTimeout(() => {resolve('B (slower)'); console.log('B (slower)')}, 2000)),
new Promise((resolve) => setTimeout(() => {resolve('C (fast)'); console.log('C (fast)')}, 10))
];
Promise.all(myPromises).then(console.log)
ในรหัสที่ปรากฏข้างต้นสามสัญญา (A, B, C) Promise.all
จะได้รับ สัญญาทั้งสามดำเนินการด้วยความเร็วที่แตกต่างกัน (C เป็นวิธีที่เร็วที่สุดและเป็น B ที่ช้าที่สุด) นั่นเป็นเหตุผลที่console.log
งบของสัญญาปรากฏในคำสั่งนี้:
C (fast)
A (slow)
B (slower)
ถ้าสัญญาเป็นการเรียก AJAX ส่วนแบ็คเอนด์ระยะไกลจะได้รับค่าเหล่านี้ตามลำดับนี้ แต่ในฝั่งไคลเอ็นต์Promise.all
ทำให้มั่นใจได้ว่าผลลัพธ์จะเรียงตามตำแหน่งดั้งเดิมของmyPromises
อาเรย์ นั่นเป็นเหตุผลที่ผลลัพธ์สุดท้ายคือ:
['A (slow)', 'B (slower)', 'C (fast)']
หากคุณต้องการรับประกันการดำเนินการตามสัญญาที่เกิดขึ้นจริงของคุณคุณจะต้องมีแนวคิดเช่นคิวสัญญา นี่คือตัวอย่างการใช้p-queue (ระวังคุณต้องห่อคำสัญญาทั้งหมดในฟังก์ชั่น):
คิวสัญญาต่อเนื่อง
const PQueue = require('p-queue');
const queue = new PQueue({concurrency: 1});
// Thunked Promises:
const myPromises = [
() => new Promise((resolve) => setTimeout(() => {
resolve('A (slow)');
console.log('A (slow)');
}, 1000)),
() => new Promise((resolve) => setTimeout(() => {
resolve('B (slower)');
console.log('B (slower)');
}, 2000)),
() => new Promise((resolve) => setTimeout(() => {
resolve('C (fast)');
console.log('C (fast)');
}, 10))
];
queue.addAll(myPromises).then(console.log);
ผลลัพธ์
A (slow)
B (slower)
C (fast)
['A (slow)', 'B (slower)', 'C (fast)']