寫 nodejs 就會用到非同步的 callback
就會碰到所謂的「callback hell」的囧境
什麼是 callback hell? 如下所示:
doSomeAsyncFunc(function () {
doSomeAsyncFunc(function () {
doSomeAsyncFunc(function () {
doSomeAsyncFunc(function () {
doSomeAsyncFunc(function () {
doSomeAsyncFunc(function () {
doSomeAsyncFunc(function () {
doSomeAsyncFunc(function () {
doSomeAsyncFunc(function () {
// 我到底在第幾層地獄啊!?
})
})
})
})
})
})
})
})
這樣光要看懂就很辛苦了,還要怎麼維護程式碼呢?
有幾種解決方式:
- async.waterfall
- promise
- async/await
上一篇介紹了 async.waterfall,現在來看看 Promise 如何使用
1. 先將 doSomeAsyncFunc 包裝成 promise 物件
doSomeAsyncFunc(function () {
return new Promise(function(resolve, reject) {
// do something, possibly async
if (/* everythings fine */) {
resolve(result);
} else {
reject(err);
}
});
}
2. 使用 primise.then 即可攤平 callback hell
var promise = doSomeAsyncFunc();
promise.then((result) => {
// get result
return '2';
}).then((result2) => {
// get result2 ('2')
return '3';
}).then((result3) => {
// get result3 ('3')
}).catch((err) => {
// error handling
});
3. 所以一開始的範例就可以改成:
var promise = doSomeAsyncFunc();
promise.then((result) => {
// do something
return doSomeAsyncFunc();
}).then((result) => {
// do something
return doSomeAsyncFunc();
}).then((result) => {
// do something
return doSomeAsyncFunc();
}).then((result) => {
// do something
return doSomeAsyncFunc();
}).then((result) => {
// do something
return doSomeAsyncFunc();
}).catch((err) => {
// error handling
});
這樣就可以攤平可怕的 callback hell,回到地球表面囉!
沒有留言:
張貼留言