: 당신은 아래의 바이올린 (ES6)에서 행동에서 볼 수
원래 약속의 입력 순서 (Aggregating 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))
];
Promise.all(myPromises).then(console.log)
위와 같이, 세 프라 (A, B, C)를 Promise.all
주어진다. 3 가지 약속은 서로 다른 속도로 실행됩니다 (C가 가장 빠르며 B가 가장 느림).
C (fast)
A (slow)
B (slower)
을 약속 AJAX 다음 원격 백엔드이 순서대로 값을 받게됩니다 호출하는 경우 : 약속의 console.log
문이 순서에 표시하는 이유입니다. 그러나 클라이언트 측에서 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)']
iterable은 어떻게 엄격하게 정렬되지 않습니까? 모든 반복 가능 항목은 값을 생성하는 순서에 따라 "엄격하게 정렬"됩니다. –
주 - Firefox는 약속의 iterables를 올바르게 구현하는 유일한 브라우저입니다. Chrome은'Promise.all '에 반복 실행 가능 코드를 전달하면 현재'excute '를 throw합니다. 또한 iterables를 전달하는 것을 지원하는 사용자 영역 약속 구현에 대해서는 아직 알지 못합니다. 많은 사람들이 그것을 토론하고 그 시점에 반대하기로 결정했습니다. –
@BenjaminGruenbaum'Object'는 (엄격하게 명령되지 않았기 때문에) 기본 반복 동작을 가지고 있지 않습니다. 즉, iterable 인터페이스를 제공하는 것과 함께 사용할 경우 구현에 따라 순서가 모호 할 수 있습니다. – Nit