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

作者站长头像
站长
· 阅读数 14

这是一个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个回答
avatar
test
2024-07-16

普通函数需要用 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 ,需要引入第三方实现)。

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容