병렬 약속 실행: Promise.all() 너머

이 게시물에서는 Promise를 병렬로 실행하고 대기 시간을 최소화하기 위해 최적화하는 방법에 대해 설명합니다.

순차적으로 실행해야 하는 많은 약속이 있을 때.then() 또는 awaits를 사용하여 순서대로 실행하십시오.

getUser()
    .then((user) => getPosts(user.id))
    .then((posts) => use(posts));

// Or

let user = await getUser();
let posts = await getPosts(user.id);
use(posts);


그러나 사용자posts를 필요로 하는 id와 같이 서로 의존하지 않는 경우,Promise.all() 를 사용하여 병렬로 실행할 수 있습니다.

let [value1, value2, valueN] = await Promise.all([promise1, promise2, promiseN]);


임의의 수의 약속 배열을 수락하고 모든 값이 포함된 약속을 반환합니다.
각각 해결되면.

그 중 하나가 실패하면 발생한 첫 번째 오류와 함께 전체rejects.

모든 것이 실패하는 것을 방지하는 한 가지 가능한 해결책은 promiseN.catch()가 있는 어레이는 항상 해결되도록 합니다. 발생하는 문제
다른 쪽에서 얻은 valueN가 해상도 또는 거부에서 비롯된 것인지 감지하는 방법입니다.

가능한 해결책은 이러한 약속에서 항상 튜플이나 객체를 반환하는 것입니다.

예시:

const wrap = (promise) => promise.then((value) => ({ error: null, value })).catch((error) => ({ error }));


이 유틸리티를 사용하여 다른 쪽의 valueN를 검사하여 성공 여부를 확인할 수 있습니다.
재시도 목적으로 더 많은 메타데이터를 반환할 수 있는 정교함의 여지가 여전히 있습니다.

const wrappedPromises = [promise1, promise2, promiseN].map((promise) => wrap(promise));
let values = await Promise.all(wrappedPromises);


Promise 배열이 거대할 때(애플리케이션에 적합한 정의에 따라)는 어떻습니까?
리소스 집약적인 프로세스를 실행 중이고 한 번에 10개를 초과하고 싶지 않습니까?

대답은 청크입니다. lodash.chunk와 같은 것을 사용하거나 직접 굴릴 수 있습니다.

let chunks = _.chunk(arrayOfPromises, 10);

for (let chunk of chunks) {
    let chunkValues = await Promise.all(chunk.map(wrap));
    use(chunkValues);
}


이것은 제가 클라이언트를 위해 수행한 최근 최적화 작업의 일부였습니다. 저만큼 도움이 되셨기를 바랍니다.

이 게시물이 마음에 드셨다면 좋아요와 팔로우를 잊지 마세요.

:wq

좋은 웹페이지 즐겨찾기