병렬 약속 실행: Promise.all() 너머
5807 단어 javascripttypescriptreactnode
순차적으로 실행해야 하는 많은 약속이 있을 때
.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
Reference
이 문제에 관하여(병렬 약속 실행: Promise.all() 너머), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/_hariti/parallel-promise-execution-beyound-promiseall-33ik텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)