Như các câu trả lời trước đã nêu, Promise.all
tổng hợp tất cả các giá trị được giải quyết với một mảng tương ứng với thứ tự đầu vào của Lời hứa ban đầu (xem Lời hứa tổng hợp ).
Tuy nhiên, tôi muốn chỉ ra rằng, đơn hàng chỉ được bảo tồn ở phía khách hàng!
Đối với nhà phát triển, có vẻ như Lời hứa đã được thực hiện theo thứ tự nhưng trên thực tế, Lời hứa được xử lý ở các tốc độ khác nhau. Điều này rất quan trọng để biết khi nào bạn làm việc với một phụ trợ từ xa vì phụ trợ có thể nhận được Lời hứa của bạn theo một thứ tự khác.
Dưới đây là một ví dụ minh họa vấn đề bằng cách sử dụng thời gian chờ:
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)
Trong mã được hiển thị ở trên, ba Lời hứa (A, B, C) được đưa ra Promise.all
. Ba Promise thực hiện ở các tốc độ khác nhau (C là nhanh nhất và B là chậm nhất). Đó là lý do tại sao các console.log
tuyên bố của Lời hứa hiển thị theo thứ tự này:
C (fast)
A (slow)
B (slower)
Nếu Lời hứa là các cuộc gọi AJAX, thì một phụ trợ từ xa sẽ nhận được các giá trị này theo thứ tự này. Nhưng về phía khách hàng Promise.all
đảm bảo rằng các kết quả được sắp xếp theo vị trí ban đầu của myPromises
mảng. Đó là lý do tại sao kết quả cuối cùng là:
['A (slow)', 'B (slower)', 'C (fast)']
Nếu bạn muốn đảm bảo thực hiện đúng các Lời hứa của mình, thì bạn sẽ cần một khái niệm như hàng đợi Promise. Dưới đây là một ví dụ sử dụng hàng đợi p (hãy cẩn thận, bạn cần phải bọc tất cả các Lời hứa trong các chức năng):
Hàng đợi hứa hẹn tuần tự
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);
Kết quả
A (slow)
B (slower)
C (fast)
['A (slow)', 'B (slower)', 'C (fast)']