nodejs解决回调地狱,async/await怎么用求指导?

这是一个controller.js, aa查询拿到结果,传给bb查询拿到结果,传给cc查询拿到结果

const aa = require("../../model/aa")
const bb = require("../../model/bb")
const cc = require("../../model/cc")

const login = (req, res) => {
    aa(req, data1 => {
        bb(data1, data2 => {
            cc(data2, data3 => {
                res.send({ msg1: data1, msg2: data2, msg3: data3 })
            })
        })
    })
}

module.exports = login

请问怎么解决掉这种回调地狱的问题,我现在都是这种嵌套写十几层才能解决业务
我希望达到这种简单的async/await写法,但是失败了击败次,实在不会,求大佬给我一下

data1 = await aa(req)
data2 = await bb(data1)
data3 = await cc(data2)

res.send({ msg1: data1, msg2: data2, msg3: data3 })
阅读 1.5k
2 个回答

普通函数需要用 Promise 包裹并使用创建 Promise 时候的 resolver 回调传参才能被 await 正确接收,以 aa 的改写为例:

function aaAsync = (req) => {
    return new Promise((resolver, reject) => {
        aa(req, resolver);
    });
}

// 调用如上包装好的函数:
const data1 = await aaAsync(req);

另外一点, async...await 语法需要环境支持,首先是语法支持,然后是全局作用域支持。
检查全局环境是否支持:

await 1;
// 直接在全局作用域执行,如果不报语法错误则说明支持

如果支持全局的话最好,直接改写所有接口就行。
如果全局不支持的话还可以试试是否支持 async...await 方法:

;(async () => {
    console.log(await 1);
    // 如果不报语法错误则说明支持
})();

如果支持的话可以用上面这种 async IIFE 来支持。
如果完全不支持的话可以试试 Promise 链式调用(不支持 async 的环境通常也没有内置 Promise ,需要引入第三方实现)。

首先要把aa bb cc封装成一个Promise,然后才能在async函数中使用await,能问出这个问题说明你完全没看过文档,先去MDN看看文档吧

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题