Class.method 不是使用 ES6 类的函数

Sli*_*lim 2 javascript node.js ecmascript-6

我创建了一个类,并且想在我的 Node.js 应用程序的路由中使用该方法。一个简单的代码片段描述了我在真实应用程序中遇到的类似问题。

myClass.js:

class MyClass {
    static async sayHi(name) {
        setTimeout(() => {
            return `Hello ${name}`
        }, 3000)
    }
}

module.exports = new MyClass()
Run Code Online (Sandbox Code Playgroud)

索引.js:

const MyClass = require('./myClass');
console.log(MyClass.sayHi)
Run Code Online (Sandbox Code Playgroud)

我收到这个错误:

undefined
Run Code Online (Sandbox Code Playgroud)

试:

console.log(MyClass.sayHi('Hello'))
Run Code Online (Sandbox Code Playgroud)

返回:

MyClass.sayHi is not a function
Run Code Online (Sandbox Code Playgroud)

Cer*_*nce 5

您正在导出该类的一个实例 - 导入时,您有一个实例,而不是实际的类。调用导入的对象MyClass很令人困惑 - 也许可以调用它myClassInstance,这样可以清楚地表明问题是什么。

如果您有一个实例,并且想要调用该类的静态方法,请引用该.constructor属性。

如果你想异步返回一些东西,最好使用 Promise,然后调用.then调用sayHi来消费 Promise:

class MyClass {
  static sayHi(name) {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve(`Hello ${name}`);
      }, 1000);
    });
  }
}

const myClassInstance = new MyClass();
// module.exports = myClassInstance;

// index.js:

// const myClassInstance = require('./index');
myClassInstance.constructor.sayHi('foo')
  .then(console.log);
Run Code Online (Sandbox Code Playgroud)

不需要静态方法为async,因为您已经显式返回了 Promise 。