我创建了一个类,并希望在我的node.js应用程序的路由中使用该方法。一个简单的代码片段描述了我在实际应用程序中遇到的一个笑脸问题。
myClass.js:
class MyClass {
static async sayHi(name) {
setTimeout(() => {
return `Hello ${name}`
}, 3000)
}
}
module.exports = new MyClass()index.js:
const MyClass = require('./myClass');
console.log(MyClass.sayHi)我发现了一个错误:
undefined试着:
console.log(MyClass.sayHi('Hello'))返回:
MyClass.sayHi is not a function发布于 2019-06-13 10:03:25
您正在导出类的实例--导入时,您有一个实例,而不是实际的类。调用导入的对象MyClass是令人费解的--也许将其称为myClassInstance,这将清楚问题所在。
如果您有一个实例,并且希望在类上调用一个静态方法,请引用.constructor属性。
如果您想异步返回某项内容,最好使用一个承诺,然后在sayHi调用上调用sayHi以使用该承诺:
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);
静态方法不需要是async,因为您已经显式地返回了一个承诺。
发布于 2019-06-13 10:01:56
您正在导出MyClass的一个实例。静态方法不是对类的实例调用的,而是对类本身调用的。
如果您像这样导出MyClass:module.exports = MyClass,那么您的第二种方法应该可以工作。
编辑:
@T.J.Crowder指出。如果类位于名为MyClass.js的文件中,则从那里导入而不是索引。
发布于 2019-06-13 10:07:20
将行从实例更改为类本身,因为静态方法是可以调用的方法,而无需创建类的实例。
module.exports = MyClass;并将要求更改为文件名。
const MyClass = require('./myClass.js');https://stackoverflow.com/questions/56577976
复制相似问题