我正在使用节点 v8.9.4 测试我的代码
我想在我的承诺链中使用类方法。但这失败并显示错误: (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 中使用类方法呢?
关于这个话题还有另一个问题:如何使用箭头函数(公共类字段)作为类方法?不幸的是,这不适用于我的节点.js设置。
没错,这是因为你的承诺中的上下文不正确。一种方法是将this
绑定到您的承诺上下文。在您的示例中,您可以像fsp.readdir('.').then(this.promiseMe.bind(this));
这样称呼它
或者,如果您更频繁地使用它,则可以将其绑定到构造函数中:
this.promiseMe = this.promiseMe.bind(this)
这将在您的类中绑定它,这样您就不再需要在每次调用时都绑定!
看起来您已经弄清楚在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();
箭头函数表达式的语法比函数短 表达式并且没有自己的 this、参数、super,或 这些函数表达式最适合非方法。 函数,并且它们不能用作构造函数。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions
您正在TypeError: Cannot read property 'attr' of undefined
this
没有引用您的类实例。