목차
1. 콜백함수 및 콜백지옥 알아보기
2. 프로미스로 단순한 방식으로 해결하는 법
3. 프로미스 체인 쓰는 이유, 프로미스 체인으로 더 깔끔하게 해결하는 법
이번 글에서도 콜백함수와 프로미스 코드를 비교하며 프로미스 체인을 쓰는 이유를 간단히 알아본다.
입력한 값이 숫자면 2초 후 2를 곱한 값을 출력하는 간단한 콜백함수다.
const getDataCallback = (num, callback) => { setTimeout(() => { if (typeof num === 'number') { callback(undefined, num*2) //error, result } else { callback('Number must be provided') } }, 2000) }
2를 곱하는 콜백함수를 두 번 호출해서 8로 만들고 싶어서 다음과 같은 코드를 작성했다.
getDataCallback(2, (err, data) => { if (err) { console.log(err) } else { getDataCallback(data, (err, data) => { //두 번 2를 곱하고 싶어서 콜백함수 다시 호출함 if (err) { console.log(err) } else { console.log(data) //8, 두번째로 2를 곱했으므로 8 } } // console.log(data) )} }) //8
const getDataPromise = (num) => new Promise((resolve, reject) => {
setTimeout(() => {
typeof num === 'number' ? resolve(num*2) : reject(console.log('Number must be provided'))
}, 2000)
})
instead of using if-else statements, we use separate functions resolve() and reject() preventing us from needing to get nested
앞서 만들었던 콜백함수처럼 if-else문 사용하는 대신 resolve(), reject() 메서드를 각각 사용해서 nesting을 최대한 피한다.
getDataPromise(2).then((data) => {
getDataPromise(data).then((data) => { //put the data into the getDataPromise() again to multiply twice
console.log(`Promise data: ${data}`)
}, (err) => {
console.log(err)
})
}, (err) => {
console.log(err)
})
still need improvement: nesting, duplicate codes
위에서 본 콜백함수 호출 방식보다 훨씬 깔끔하지만 여전히 nesting이 되어 있고, 중복되는 코드가 있다. 이는 프로미스 체인으로 해결할 수 있다.
getDataPromise('10').then((data) => {
return getDataPromise(data)
}).then((data) => {
return getDataPromise(data)
}).then((data) => {
console.log(data)
}).catch((err) => { //catch: an error handler for all of our promises in the promise chaining
console.log(err)
})