프로미스 동시성(Promise concurrency)를 지원하는 메소드

hejuby·2024년 4월 3일
0

개요

Promise 클래스의 정적 메소드 중 동시성을 지원하기 위해서 제공되는 네 가지 메소드에 대해 살펴보겠습니다. 이 메소드들은 모두 이터러블(예를 들어, 배열)을 인자로 받아 프로미스 객체를 반환한다는 특징을 가지고 있습니다.

  • Promise.all()
  • Promise.allSettled()
  • Promise.any()
  • Promise.race()

동시성 메소드의 종류

Promise.all()

Promise.all() 메소드는 말 그대로 모든(all) 프라미스가 이행한 후에 이행합니다. 따라서 프라미스의 반환 값에는 다음과 같은 세 케이스가 있을 수 있습니다.

  1. 이미 이행함, 인자로 받은 이터러블이 비어 있는 경우.

    • 이 경우 이미 이행한 프라미스를 반환합니다.
  2. 비동기적으로 이행함, 이터러블의 모든 프라미스를 이행한 경우.

    • 이행한 값의 배열을 반환합니다. 이 때 배열의 순서는 이행이 완료된 순서가 아닌 인자로 주어진 프라미스의 순서에 따릅니다.
    • 인자로 주어진 이터러블에 대기 중인 프라미스가 없더라도 메소드는 비동기적으로 이행된 값을 반환합니다.
  3. 비동기적으로 거부됨, 이터러블의 프로미스 중 하나라도 거부된 경우.

프라미스 중 하나라도 거부되면 즉시 거부되는 특성 상, Promise.all()은 프라미스의 모두 이행이 기대될 때 사용하기 적합합니다.
반대로 이행 여부와 관계 없이 이터러블을 순회하고 싶다면 Promise.allSettled()를 사용하는 것이 좋습니다.

Promise.allSettled()

Promise.allSettled() 메소드는 모든 프라미스가 처리된(settled) 후에 이행합니다. 위에서 언급한 것처럼 이는 프라미스 각각의 이행 또는 거부 어느 상황이든 관계 없이 동작합니다. 따라서 다음과 같은 케이스를 가집니다.

  1. 이미 이행함, 인자로 받은 이터러블이 비어 있는 경우.

  2. 비동기적으로 이행함, 이터러블의 모든 프라미스가 처리된 경우.

    • 이행한 프라미스의 경우, value 프로퍼티에 이행된 값을 가집니다.
    • 거부된 프라미스의 경우, reason 프로퍼티에 에러 값을 가집니다.

Promise.allSettled() 메소드는 Promise.all() 보다 인자로 받는 프라미스가 서로 독립적으로 동작하는 상황에 적합합니다.

또한 Promise.all()Promise.allSettled() 메소드는 async/await보다 동시성에서 우위를 가집니다. 여러 개의 프라미스를 한번에 처리하는 경우 async/await는 앞의 프라미스가 처리되기를 기다리지만, 프라미스 동시성 메소드를 사용한다면 이러한 기다림을 가질 필요가 없습니다.

Promise.any()

Promise.any() 메소드는 Promise.all()과 반대로 하나의 프라미스라도 이행하면 이행한 프라미스를 반환합니다. 정확히는, 가장 먼저 이행한 첫번째 프라미스의 이행된 값을 반환합니다. 따라서 이행할 프라미스가 없는 빈 배열을 입력받은 경우 거부됩니다.

  1. 이미 거부됨, 인자로 받은 이터러블이 비어 있는 경우.

  2. 비동기적으로 이행함, 이터러블의 프라미스 중 하나라도 이행한 경우.

    • 이터러블을 순회하는 중 (배열 순서와 상관 없이) 가장 첫번째로 이행 완료한 값을 반환합니다.
  3. 비동기적으로 거부됨, 이터러블의 모든 프라미스가 거부된 경우.

    • 이 때 메소드는 AggregateError와 함께 반환합니다.

이터러블 안의 순서와는 상관 없이 가장 먼저 이행한 결과 값만을 이용하고자 할 때에도 Promise.any()가 유용합니다.

Promise.race()

Promise.race() 메소드는 Promise.any() 메소드와 비슷하지만, 이행 또는 거부 여부과 관계 없이 가장 먼저 처리된 프라미스를 반환합니다. 따라서 Promise.race() 메소드는 항상 비동기적인 결과를 반환합니다.

인자로 빈 배열이 주어진 경우 메소드는 영원히 기다리는 상태의 프라미스를 반환하게 됩니다.

0개의 댓글