ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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 발생!!"이 출력된다.
Designed by Tistory.