then()
을 이용하여 추가한 콜백도 현재 실행중인 콜 스택을 완료하기 이전에는 호출되지 않음resolve
는 비동기 작업을 성공적으로 완료해 결과를 값으로 반환할 때 호출됨resolve
함수의 전달인자를 값으로 반환reject
는 작업이 실패하여 오류의 원인을 반환할 때 호출하면 되며, 주로 오류 객체를 받음reject
함수의 전달인자를 값으로 반환onFulfilled
, onRejected
중 상태에 맞는 콜백이 함수가 아닐 경우) 처리된 값과 상태 그대로 처리되는 새로운 프로미스를 반환let promise = new Promise((resolve, reject) => {
// 수행한 비동기 작업이 성공한 경우 resolve(...)를 호출하고, 실패한 경우 reject(...)를 호출
let a = 5 + 5 //해야하는 작업
if (a === 10) {
resolve('Success')
}else {
reject('Failed')
}
});
promise
.then((message) => {
//messages는 위에서 resolve(...) 호출에 제공한 값
console.log('This is in the then ' + message)
})
.catch((message) => {
//messages는 위에서 reject(...) 호출에 제공한 값
console.log('This is in the catch ' + message)
})
then()
을 여러 번 사용해서 여러 개의 콜백을 추가하고, 각각의 콜백이 순서대로 실행하도록 일종의 체인을 만듦
new Promise(function(resolve, reject) {
setTimeout(() => resolve(1), 1000); // 1초 후 최초 프라미스가 실행
}).then(function(result) { // 1이 result로 전달됨
alert(result); // 1
console.log(result * 2) //2
return result * 2; // 2 * 1 => 2가 리턴됨
}).then(function(result) { // 앞에서 리턴한 값인 2가 result로 전달됨
alert(result); // 2
console.log(result * 2) //4
return result * 2// 2 * 2 => 4가 리턴됨
}).then(function(result) { // 앞에서 리턴한 값인 4가 result로 전달됨
alert(result); // 4
console.log(result * 2) //8
return result * 2 // 4 * 2 => 8이 리턴됨
});
Array와 같이 순회 가능한(iterable) 객체
const promise1 = Promise.resolve('success');
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'foo');
});
Promise.all([promise1, promise2, promise3]).then((values) => {
console.log(values); // ["success", 42, "foo"]
});
참고자료
mdn Promise
The Complete JavaScript Promise Guide(영어)
javascriptInfo, Promise-chaing
mdn, promise.all()