약속.all: 해결된 값의 순서
MDN을 보면values
에 전달되었습니다.then()
Promise의 콜백.모두 약속 순서대로 값을 포함합니다.예를 들어 다음과 같습니다.
var somePromises = [1, 2, 3, 4, 5].map(Promise.resolve);
return Promise.all(somePromises).then(function(results) {
console.log(results) // is [1, 2, 3, 4, 5] the guaranteed result?
});
어떤 순서로 명세서를 인용할 수 있습니까?values
들어와야 하나요?
PS: 이와 같은 코드를 실행한 결과, 이것이 사실인 것 같습니다.물론 증거는 아니지만 우연의 일치일 가능성이 있습니다.
곧 순서는 유지됩니다.
링크된 사양에 따라는 를 파라미터로 하여 내부적으로 호출합니다.이 경우 후자는 루프 오버합니다.iterable
를 사용합니다.
해결은 해결된 각 약속에 내부가 있는 곳을 통해 구현됩니다.[[Index]]
slot : 원래 입력으로 약속 인덱스를 표시합니다.
이는 Promise.all()에 전달할 수 있는 반복 가능한 명령어(예를 들어 배열)를 통해 출력 순서가 엄밀하게 지정됨을 의미합니다.
이것은, 다음의 바이올린(ES6)으로 동작하고 있는 것을 알 수 있습니다.
// Used to display results
const write = msg => {
document.body.appendChild(document.createElement('div')).innerHTML = msg;
};
// Different speed async operations
const slow = new Promise(resolve => {
setTimeout(resolve, 200, 'slow');
});
const instant = 'instant';
const quick = new Promise(resolve => {
setTimeout(resolve, 50, 'quick');
});
// The order is preserved regardless of what resolved first
Promise.all([slow, instant, quick]).then(responses => {
responses.map(response => write(response));
});
앞서 말한 바와 같이Promise.all
는 해결된 모든 값을 원래 Promise의 입력 순서에 대응하는 배열로 집약합니다(「Promise의 집약」을 참조).
단, 주문은 클라이언트측에서만 유지되고 있다는 것을 지적하고 싶습니다!
개발자에게는 약속이 순서대로 이행된 것처럼 보이지만 실제로는 약속이 다른 속도로 처리됩니다.리모트 백엔드를 사용할 때는 백엔드가 다른 순서로 Promise를 수신할 수 있기 때문에 이 점을 알아두는 것이 중요합니다.
다음으로 타임아웃을 사용하여 문제를 나타내는 예를 나타냅니다.
약속.모든.
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)
위의 코드에서는, 다음의 3개의 약속(A, B, C)이 주어집니다.Promise.all
3개의 Promise는 다른 속도로 실행됩니다(C가 가장 빠르고 B가 가장 느림).그렇기 때문에console.log
Promise 문장은 다음 순서로 표시됩니다.
C (fast)
A (slow)
B (slower)
Promise가 AJAX 콜인 경우 리모트백엔드는 다음 순서로 이들 값을 수신합니다.하지만 클라이언트 측에서는Promise.all
결과가 원래 위치에 따라 정렬되도록 합니다.myPromises
어레이. 그래서 최종 결과는 다음과 같습니다.
['A (slow)', 'B (slower)', 'C (fast)']
Promise의 실제 실행도 보장하려면 Promise 큐와 같은 개념이 필요합니다.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)']
,, 의의 입니다.results
, 입니다.promises
.
의 ES6 사양을 인용할 수도 있지만 사용되는 반복 API와 일반적인 약속 생성자 때문에 다소 복잡합니다.단, 각 리졸바 콜백에는[[index]]
어트리뷰트를 지정합니다.이 Atribut은 Promise-Array 반복으로 작성되어 결과 배열의 값을 설정하기 위해 사용됩니다.
언급URL : https://stackoverflow.com/questions/28066429/promise-all-order-of-resolved-values
'programing' 카테고리의 다른 글
연결된 데이터베이스가 MariaDB인지 MySQL인지 어떻게 알 수 있습니까? (0) | 2022.11.26 |
---|---|
항목이 JavaScript 배열에 있는지 확인하는 가장 좋은 방법은 무엇입니까? (0) | 2022.11.26 |
1234 == '1234 검정'이 참으로 평가되는 이유는 무엇입니까? (0) | 2022.10.29 |
포어치 인덱스는 어떻게 찾죠? (0) | 2022.10.29 |
C 모든 케이스 뒤에 있는 스위치 대소문자의 중괄호 (0) | 2022.10.29 |