You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 04:40:24