이전 답변에서 이미 언급했듯이 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)']