Node.js中含async/await的类无执行效果问题排查
问题分析与修复
你的代码存在几个关键问题,导致程序挂起无输出:
1. Promise构造函数内的异步函数未执行
do_stuff中创建Promise时,传入了一个async函数但没有调用它,这会导致Promise永远不会触发resolve或reject,await mc.do_stuff()会一直处于等待状态,后续代码完全无法执行。
2. 错误的Promise结果处理逻辑
await do_first('fail')不能用数组解构[res, rej]来获取成功/失败结果。Promise成功时只会返回单个值,失败时会直接抛出异常,必须用try/catch捕获错误,而非解构返回值。
3. 类方法调用未绑定this
调用类内的do_first和do_second时,没有添加this.前缀,直接调用会导致找不到这两个方法,触发未定义错误。
4. 拼写错误
do_first和do_second中的resolve被错写成resole,这会导致Promise无法正常完成resolve流程。
修正后的代码
my_class.js
class MyClass { constructor() { this.message = 'hello'; } do_stuff = async function() { try { // 先执行第一个任务 await this.do_first('fail'); console.log('do_first() succeeded, no call to do_second().'); return 'success'; } catch (err) { console.log('do_first() failed.'); try { // 第一个任务失败,执行第二个任务 await this.do_second('succeed'); console.log('do_second() succeeded.'); return 'success'; } catch (err2) { console.log('do_second() failed.'); throw 'failed'; } } } do_first = async function(param) { return new Promise((resolve, reject) => { if (param === 'fail') { console.log('rejecting do_first()'); reject('failure'); } else { console.log('resolving do_first()'); resolve('success'); } }); } do_second = async function(param) { return new Promise((resolve, reject) => { if (param === 'fail') { console.log('rejecting do_second()'); reject('failure'); } else { console.log('resolving do_second()'); resolve('success'); } }); } } exports.MyClass = MyClass
main.js(无需修改)
(async function main() { let { MyClass } = require("./my_class.js"); const mc = new MyClass(); await mc.do_stuff(); console.log(mc.message); })();
运行修正后的代码,会输出:
rejecting do_first() do_first() failed. resolving do_second() do_second() succeeded. hello
内容的提问来源于stack exchange,提问作者Michiel
相关产品推荐
相关产品推荐

