[JavaScript] 프라미스 API

Promise.all

여러 프라미스가 모두 이행될 때까지 기다린 후, 각 프라미스의 결과를 배열로 반환합니다.

단, 전달된 프라미스 중 하나라도 거부되면 전체 프라미스가 거부됩니다.

// 각각 다른 시간에 이행되는 프라미스들
const p1 = new Promise(resolve => setTimeout(() => resolve("Data A"), 3000));
const p2 = new Promise(resolve => setTimeout(() => resolve("Data B"), 2000));
const p3 = new Promise(resolve => setTimeout(() => resolve("Data C"), 1000));

// 실패하는 프라미스
const p4 = new Promise((resolve, reject) => 
  setTimeout(() => reject(new Error("Failed to fetch Data D")), 1000)
);

// p4를 포함하면 거부되기 때문에 전체 프라미스가 catch 영역으로 갑니다.
Promise.all([p1, p2, p3])
  .then(results => {
    console.log("모든 데이터 수신:", results); // ["Data A", "Data B", "Data C"]
    // 결과 배열의 순서는 Promise.all에 전달한 순서대로입니다.
  })
  .catch(error => {
    console.error("하나 이상의 요청이 실패했습니다:", error);
  });

Promise.allSettled

전달된 프라미스들이 모두 처리될 때까지 기다린 후, 각 프라미스의 결과 상태와 값을 객체로 반환합니다.
하나라도 거부되더라도 전체 결과를 확인할 수 있습니다.

const apiCalls = [
  new Promise(resolve => setTimeout(() => resolve("Result 1"), 1500)),
  new Promise((resolve, reject) => setTimeout(() => reject(new Error("Fail 2")), 1000)),
  42  // 프라미스가 아닌 값은 그대로 이행 상태로 처리됩니다.
];

Promise.allSettled(apiCalls)
  .then(results => {
    results.forEach((result, index) => {
      if (result.status === "fulfilled") {
        console.log(`API ${index + 1} 성공:`, result.value);
      } else {
        console.error(`API ${index + 1} 실패:`, result.reason);
      }
    });
  });

Promise.race

전달된 프라미스들 중 가장 먼저 처리(이행 또는 거부)되는 프라미스의 결과를 반환합니다.

const fast = new Promise(resolve => setTimeout(() => resolve("Fast response"), 500));
const slow = new Promise(resolve => setTimeout(() => resolve("Slow response"), 2000));
const errorPromise = new Promise((resolve, reject) =>
  setTimeout(() => reject(new Error("Error response")), 1000)
);

Promise.race([slow, errorPromise, fast])
  .then(result => {
    console.log("최초 응답:", result); // "Fast response"가 출력됩니다.
  })
  .catch(error => {
    console.error("최초 응답 에러:", error.message);
  });

Promise.resolve

주어진 값을 이행 상태의 프라미스로 감싸 반환합니다.
이미 프라미스인 경우 그대로 반환하므로, 항상 프라미스 형태의 결과를 보장합니다.

const cache = new Map();

function getCachedData(key) {
  if (cache.has(key)) {
    // 이미 저장된 값은 즉시 이행된 프라미스로 반환
    return Promise.resolve(cache.get(key));
  }
  // 실제 비동기 작업 예시: 네트워크 요청 (여기선 setTimeout 사용)
  return new Promise(resolve => {
    setTimeout(() => {
      const data = `Fetched data for ${key}`;
      cache.set(key, data);
      resolve(data);
    }, 1500);
  });
}

getCachedData("user:123")
  .then(data => console.log("첫 호출:", data))
  .then(() => getCachedData("user:123"))
  .then(data => console.log("캐시 호출:", data));

Promise.reject

주어진 에러(또는 값)를 거부 상태의 프라미스로 감싸 반환합니다.

function validateNumber(n) {
  if (typeof n !== "number") {
    return Promise.reject(new TypeError("숫자만 허용됩니다."));
  }
  return Promise.resolve(n);
}

validateNumber("abc")
  .then(n => console.log("숫자:", n))
  .catch(err => console.error("검증 에러:", err.message));