Promsie
는 비동기 작업의 상태(이행이나 실패)와 그 결과 값(실패의 경우 error)을 나타내는 객체
promise(약속)라는 단어 속에는 비동기 작업의 결과를 미래의 어떠한 시점에 제공하겠다는 약속의 의미가 담김
이를 통해 비동기 메서드를 마치 동기 메서드처럼 다룰 수 있게 됨
callback hell현상을 극복할 수 있는 문법
let promise = new Promise(function(resolve, reject) {
// 시간이 걸리거나 비동기 작업에 대한 코드
// resolve나 reject를 호출하는 코드
})
new Promise
에 전달되는 함수
new Promise
가 실행될 때 자동 실행됨resolve
와 reject
라는 JS가 자체 제공하는 콜백함수를 가짐resolve(value)
: 작업이 성공적으로 완료 경우 호출됨reject(error)
: 작업 중 에러가 발생한 경우 호출됨객체 promise
는 다음 두 가지의 private 속성을 가짐
state
fulfilled
: 작업이 성공적으로 완료됨rejected
: 작업 실패pending
: 작업이 완료되기 전 상태result
value
: resolve
의 인수error
: reject
의 인수executor
의 작업이 끝난 후(status of [fulfilled, rejected]
)에 Promise
객체의 private 속성 state
, result
에 접근하여 비동기 작업 이후의 동작을 코딩할 수 있게 해줌
then
promise.then(
function(result) { /* status가 fulfilled일 때의 result인 value를 다룸 */ },
function(error) { /* status가 rejected일 때의 result인 error를 다룸 */ }
)
.then(f)
: 성공한 경우만 다루는 경우.then(null, f)
: 실패한 경우만 다루는 경우catch
.catch(f) == .then(null, f)
finally
fullfilled
이거나 rejected
이거나 반드시 실행됨
function callbackHell() {
setTimeout(() => { // 첫 번째 콜백
let result = 1
alert(result)
setTimeout(() => { // 두 번째 콜백
result *= 2
alert(result)
setTimeout(() => { // 세 번째 콜백
result *= 2
alert(result)
}, 1000)
}, 1000)
}, 1000)
}
function usePromise() {
new Promise((resolve, reject) => {
setTimeout(() => resolve(1), 1000)
})
.then(result => {
alert(result)
return new Promise((resolve, reject) => {
setTimeout(() => resolve(result * 2), 1000)
})
})
.then(result => {
alert(result)
return new Promise((resolve, reject) => {
setTimeout(() => resolve(result * 2), 1000)
})
})
.then(alert)
}
const promise1 = Porise.resolve('성공1')
const promise1 = Porise.resolve('성공2')
Promise.all([promise1, promise2])
.then((result) => {
console.log(result) // ['성공1', '성공2']
})
.catch((error) => {
console.error(error)
})
Promise.all()
, Promise.allSetteld()
, Promise.any()
을 사용하면 여러 개의 Promise 처리를 한 번에 할 수 있고 코드가 간결해짐Promise.all()
은 여러 개의 프로미스를 처리하면서 하나라도 실패하면 빠져나옴.Promise.allSetteld()
은 모든 프로미스를 끝까지 처리하고 실패한 프로미스를 추적 가능Promise.any()
은 하나의 프로미스라도 성공하면 빠져나옴