-
Promises의 all, race, allSettled 사용하기JavaScript 2023. 1. 9. 22:15
Promises는 자바스크립트에서 비동기를 처리하기 위해서 사용된다.
Promises는 처음에는 pending 상태였다가 처리에 성공하면 fulfilled, 실패하면 rejected 상태가 된다.
Promises 성공하거나 실패하기만 한다.
Promises.race, Promises.all, Promise.allSettled 에 대해서도 알아본다.
기본적인 Promise 사용법
const fn = () => { return new Promise((resolve, reject) => { try { setTimeout(() => resolve("Good!"), 5000) } catch (err) { reject(err); } }); } fn() .then(el => console.log(el)) .catch(err => console.log(err));Promise.race 사용 예
const fast = new Promise((resolve, reject) => { try { setTimeout(() => { resolve("fast ok"); }, 1500); } catch (err) { reject(err); } }); const late = new Promise((resolve, reject) => { try { setTimeout(() => { resolve("late ok"); }, 3500); } catch (err) { reject(err); } }); Promise.race([fast, late]) .then(el => console.log(el)) .catch(err => console.log(err));- 출력되는 값은 fast ok이다.
- 여러 개의 Promise가 경쟁하여 가장 먼저 resolve되는 객체의 값을 반환하게 된다.
Promise all 사용 예
const fast = new Promise((resolve, reject) => { try { setTimeout(() => { resolve("fast ok"); }, 1500); } catch (err) { reject(err); } }); const late = new Promise((resolve, reject) => { setTimeout(() => { reject("late fail"); }, 3500); }); const tooLate = () => new Promise((resolve, reject) => { try { setTimeout(() => { resolve("too late ok"); }, 7500); } catch (err) { reject(err); } }); Promise.all([fast, late, tooLate()]) .then(el => console.log(el)) .catch(err => console.log(err));- 위의 코드가 출력하는 값은 late fail이다.
- Promise.all은 여러 비동기 함수에서 하나라도 실패하면 실패한 결과를 반환한다.
const fast = new Promise((resolve, reject) => { try { setTimeout(() => { resolve("fast ok"); }, 1500); } catch (err) { reject(err); } }); const late = new Promise((resolve, reject) => { try { setTimeout(() => { resolve("late ok"); }, 3500); } catch (err) { reject(err); } }); const tooLate = () => new Promise((resolve, reject) => { try { setTimeout(() => { resolve("too late ok"); }, 7500); } catch (err) { reject(err); } }); Promise.all([fast, late, tooLate()]) .then(el => console.log(el)) .catch(err => console.log(err));- 위의 코드가 출력하는 결과값은 ["fast ok","late ok","too late ok"] 이다.
- 모두 성공한 경우에 순서대로 값을 담아 반환한다.
Promise.allSettled 사용 예
const fast = new Promise((resolve, reject) => { try { setTimeout(() => { resolve("fast ok"); }, 1500); } catch (err) { reject(err); } }); const late = new Promise((resolve, reject) => { setTimeout(() => { reject("late fail"); }, 3500); }); const tooLate = () => new Promise((resolve, reject) => { try { setTimeout(() => { resolve("too late ok"); }, 7500); } catch (err) { reject(err); } }); Promise.allSettled([fast, late, tooLate()]) .then(el => console.log(el)) .catch(err => console.log(err));- 위의 코드가 출력하는 값은 다음과 같다.
[{status: 'fulfilled', value: 'fast ok'}, {status: 'rejected', reason: 'late fail'}, {status: 'fulfilled', value: 'too late ok'}]- Promise.allSettled는 결과값으로 status와 value또는 reason을 객체에 담아 배열로 내보낸다.
- Promise.all과는 다르게 실패한 케이스가 있어도 모든 결과를 기다린 후 모든 결과를 알려준다.
Promise reject 처리
const time = () => { return new Promise((resolve, reject) => { try { throw new Error("에러 발생!"); setTimeout(() => { resolve(100); }, 1500); } catch { reject("ERROR 발생"); } }); } const fn = async () => { console.log("Start"); try { const data = await time(); console.log(data); } catch (e) { console.log(e + "!!"); } } fn();- "Start"와 "ERROR 발생!!"이 출력된다.
'JavaScript' 카테고리의 다른 글
JSON과 JSON.stringify, JSON.parse (0) 2023.01.16 자바스크립트 클로저(Closures)란? (1) 2023.01.11 이더리움 지갑과 관련된 javascript 라이브러리들 살펴보기 (0) 2023.01.06 Optional chaining (?.)에 대해서 (0) 2022.12.28 Queue in Javascript (0) 2022.12.06