我正在使用节点v8.9.4测试我的代码
我想在我的Promise链中使用类方法。但这失败并显示错误:
(node:68487) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): TypeError: Cannot read property 'attr' of undefined
const fsp = require('fs-promise');
class MyClass {
constructor() {
this.attr = 'value';
}
promiseMe() {
console.log(this.attr);
}
main() {
fsp.readdir('.').then(this.promiseMe);
}
}
new MyClass().main();
因此,我尝试将箭头函数用作类方法。
但是将箭头函数定义为类方法在语法上是不正确的:
Unexpected token =
promiseMe = () => {
console.log(this.attr);
}
这可行,但确实很丑:
const fsp = require('fs-promise');
class MyClass {
constructor() {
this.attr = 'value';
this.promiseMe = () => {console.log(this.attr);}
}
main() {
this.promiseMe();
}
}
new MyClass().main();
那我怎样才能在Promise中使用类方法?
关于此主题还有另一个问题: How to use arrow functions (public class fields) as class methods? 不幸的是,这不适用于我的node.js设置。
答案 0 :(得分:2)
对,这是因为您的承诺中的上下文不正确。一种方法是将this
绑定到Promise上下文。在您的示例中,您将其命名为fsp.readdir('.').then(this.promiseMe.bind(this));
或者,如果您更频繁地使用它,则可以将其绑定到构造函数中:
this.promiseMe = this.promiseMe.bind(this)
这会将它绑定到您的班级中,这样您就不必在每次调用时都绑定它!
答案 1 :(得分:0)
箭头函数表达式的语法比函数短 表达式,并且没有自己的this,arguments,super或 新目标。这些函数表达式最适合非方法 函数,它们不能用作构造函数。
您得到TypeError: Cannot read property 'attr' of undefined
是因为this
没有引用您的类实例。
答案 2 :(得分:0)
似乎您已经弄清楚class
语法中可以使用的选项。但我建议您问问自己class
的语法/机制是否确实在提供您需要的东西。
很可能您可以通过使用工厂函数来完成所需的一切。这避免了使用this
的所有丑陋怪癖:
const fsp = require('fs-promise');
function myClass() {
let attr = 'value';
const promiseMe = () => console.log(attr);
const main = () => fsp.readdir('.').then(promiseMe);
return { promiseMe, main };
}
myClass().main();