【问题标题】:Nodejs - class with async await does nothingNodejs - 带有异步等待的类什么都不做
【发布时间】:2022-12-18 11:14:57
【问题描述】:

我是 Node.JS 的新手,但对其他语言有一些经验。我正在努力实现以下目标:

  • 我想执行一项任务,如果失败则执行另一项任务。

我有两个文件:一个是主要功能,另一个包含类。 首先是主要功能(main.js):

(async function main() {
        let { MyClass } = require("./my_class.js");
        const mc = new MyClass();

        await mc.do_stuff();
        console.log(mc.message);
})();

另一个是类(my_class.js)

class MyClass {
  constructor() {
    this.message='hello';
  }

  do_stuff=async function() {
    return new Promise((resolve,reject) => async function (){
       let [res,rej]=await do_first('fail');
       if(rej) {
          console.log('do_first() failed.');
          [res,rej]=await do_second('succeed');
          if(rej) {
             console.log('do_second() failed.');
             reject('failed');
          } else {
             console.log('do_second() succeeded.');
             resolve('success');
          }
       } else {
          console.log('do_first() succeeded, no call to do_second().');
          resolve('success');
       }
    });
  }

  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()');
          resole('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()');
          resole('success');
       }
    });
  }
}

exports.MyClass = MyClass

如果我尝试使用 node ./main.js 运行它,什么也不会发生。如果我在没有 await 的情况下运行 mc.do_stuff(),我确实得到了你好......我错过了哪些船? 就此而言:我正在运行 NodeJS v18.12.0

【问题讨论】:

    标签: node.js async-await


    【解决方案1】:

    此处需要更改一些内容才能使其正常工作:

    • 使用await 时,只有Promise.resolve 恢复正常代码执行。 Promise.reject 总是引发异常。
    • 打字错误resole
    • 更改代码以始终使用箭头语法。这需要引用函数作为实例成员 -> this.do_first。我想这是你的意图。之前的语法并没有将函数作为对象的一部分执行,而是在全局范围内执行。

    这是您处于工作状态的代码

    class MyClass {
      constructor() {
        this.message = "hello";
      }
    
      do_stuff = async () => {
        return new Promise(async (resolve, reject) => {
          try {
            await this.do_first("fail");
            console.log("do_first() succeeded, no call to do_second().");
            resolve("success");
          } catch (err) {
            console.log("do_first() failed.");
    
            try {
              await this.do_second("succeed");
              console.log("do_second() succeeded.");
              resolve("success");
            } catch (err) {
              console.log("do_second() failed.");
              reject("failed");
            }
          }
        });
      };
    
      do_first = async (param) => {
        return new Promise(async (resolve, reject) => {
          if (param === "fail") {
            console.log("rejecting do_first()");
            reject("failure");
          } else {
            console.log("resolving do_first()");
            resolve("success");
          }
        });
      };
    
      do_second = async (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;
    
    PS C:UserspatrickDocumentsGitHubstackoverflow-74714360> node ./main.js
    rejecting do_first()
    do_first() failed.
    resolving do_second()
    do_second() succeeded.
    hello
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-30
      • 1970-01-01
      • 1970-01-01
      • 2018-07-17
      • 1970-01-01
      • 2019-05-25
      • 2019-07-20
      相关资源
      最近更新 更多