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个回答

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 ,需要引入第三方实现)。
回复

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