nodejs嵌套回调地狱,怎么优化?

依然洋葱
  • 70

我写controller,容易一层一层嵌套,回调里再执行另一个controller

const aa = require("aa")
const bb = require("bb")
const cc = require("cc")

aa(data,  (aaRes)=> {
    bb (aaRes,  (bbRes) =>) {
        cc (bbRes,  (ccRes) =>) {
            res.send({
                code:0,
                msg: "获取成功"
            })
        }
    }
})

怎么优化这种写法?

回复
阅读 1.8k
6 个回答
zangeci
  • 10.5k
✓ 已被采纳

根据函数的性质来写一个promisify,将函数包装成一个promise,这样就可以用async/await

function promisify(fn) {
    return function (data) {
        return new Promise((resolve, reject) => {
            try {
                fn(data, resolve)
            }catch(err) {
                reject(err);
            }
    })
  }
}

function aa(data, cb) {
    setTimeout(() => cb('a data is:' + data))
}

function bb(data, cb) {
    setTimeout(() => cb('b data is:' + data))
}

function cc(data, cb) {
    setTimeout(() => cb('c data is:' + data))
}

(async () => {
     const aaRes = await promisify(aa)('from a;');
     const bbRes = await promisify(bb)('from b;' + aaRes);
    const ccRes = await promisify(cc)('from c;' + bbRes);
    console.log(ccRes);
 })()
边城
  • 54.8k

http://nodejs.cn/api/util.html#utilpromisifyoriginal

了解下Promise和async/await

gaoryrt
  • 4k

把 aa bb cc 改造成返回 promise 的方法,然后使用 async await

const aa = require("aa")
const bb = require("bb")
const cc = require("cc")

async function main() {
    const aaRes = await aa(data)
    const bbRes = await bb(aaRes)
    const ccRes = await cc(bbRes)
    res.send({
        code:0,
        msg: "获取成功"
    })
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏