寫 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,回到地球表面囉!
沒有留言:
張貼留言