자바스크립트

[인간 JS엔진 되기] 2-2. 프로미스의 최고의 장점

옴악핫세 2023. 12. 21. 10:18

Promise

Promise는 실행한 결과값을 나중에 쓸 수 있는 장점이 있음

 

아래 예시 코드는 setTimeout 비동기 함수를 사용했을 떄의 상황

setTimeout 내부의 결과는 10초가 지나면 무조건 실행됨

그래서 사용자가 원하는 시간이 바뀌어지면 시간을 계속 바꿔줘야함

//1초 뒤에 자동 실행
//결과를 바로 받고싶지 않아도 받을 수 밖에 없음
setTimeout(()=> {
    let data = '10초';
    console.log(data)
}, 10000)

 

하지만 Promise는 사용자가 원하는 시간에 결과값을 사용할 수 있음!

//하지만 promise를 쓰면 변수에 담아서 then을 이용해 우리가 결과를 사용하고싶을 때, 사용할 수 있음
const promise = new Promise((resolve, reject) => {
    setTimeout(()=> {
        let data = 'promise 1초'
        resolve(data);
    }, 0)
})


promise.then((resolve) => {
    console.log(resolve)
})

 


콜백도 결과값을 바로 받아야하는 단점을 가지고 있음

 

아래 처럼 외부 api 응답을 받아서 나중에 내가 원할 때 사용 할 수 있음

all 대신 allSettled 사용하자!

const p1 = axios.get('서버주소1')
const p2 = axios.get('서버주소2')
const p3 = axios.get('서버주소3')
const p4 = axios.get('서버주소4')
const p5 = axios.get('서버주소5')
const p6 = axios.get('서버주소6')
const p7 = axios.get('서버주소7')


//all의 단점은 하나라도 실패하면 catch 에러로 떨어짐
promise.all([p1,p2,p3,p4,p5,p6,p7])
	.then((result) => {})
	.catch((error) => {});

//allSettled를 이용하면 실패한 것만 필터링해서 다시 시도 가능
promise.allSettled([p1,p2,p3,p4,p5,p6,p7])
	.then((result) => {})
	.catch((error) => {});