then
을 호출하게 되면 똑같은 Promise
를 반환하기 때문에 return된 Promise
에 다시 then
호출들을 연결하거나 catch
를 호출 할 수 있게 된다. 이걸 Promise Chaning
이라고 한다.
프로미스는 프로미스 체이닝을 통해 비동기 처리 결과를 전달받아 후속 처리를 하므로 비동기 처리를 위한 콜백 패턴에서 발생하던 콜백 헬이 발생하지 않는다. 다만 프로미스도 콜백 패턴을 사용하므로 콜백 함수를 사용하지 않는 것은 아니다.
let fetchNumber = new Promise(function (resolve, reject) {
setTimeout(function () {
resolve(1)
}, 1000)
});
fetchNumber
.then(function (num) {
return num * 2 // 2
})
.then(function (num) {
return num * 3 // 6
})
.then(function (num) {
return new Promise(function (resolve, reject) {
setTimeout(function () {
resolve(num - 1) // 6 - 1 = 5
}, 1000)
})
})
.then(function (num) {
console.log(num) // 5
})
function func1() {
let promiseSomething = new Promise(function (resolve, reject) {
setTimeout(function () {
resolve('첫 번째')
}, 2000)
});
return promiseSomething;
}
function func2() {
let promiseSomething = new Promise(function (resolve, reject) {
setTimeout(function () {
resolve('두 번째')
}, 3000)
});
return promiseSomething;
}
func1()
.then(function (value) {
console.log(value); // func1의 resolve인 '첫 번째'를 2초 뒤 출력하고
return func2(); // func2를 리턴
})
.then(function (value) { // 여기서 then은 func2이므로
console.log(value); // func2의 resolve인 '두 번째'를 func1이 실행되고 3초 뒤 출력
});