使用 ECMAScript 6 箭头函数作为类方法



我正在使用节点 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没有引用您的类实例。

最新更新