将ECMAScript 6箭头函数用作类方法

时间:2018-12-23 14:00:11

标签: javascript ecmascript-6 arrow-functions

我正在使用节点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设置。

3 个答案:

答案 0 :(得分:2)

对,这是因为您的承诺中的上下文不正确。一种方法是将this绑定到Promise上下文。在您的示例中,您将其命名为fsp.readdir('.').then(this.promiseMe.bind(this));

或者,如果您更频繁地使用它,则可以将其绑定到构造函数中:

this.promiseMe = this.promiseMe.bind(this)

这会将它绑定到您的班级中,这样您就不必在每次调用时都绑定它!

答案 1 :(得分:0)

  

箭头函数表达式的语法比函数短   表达式,并且没有自己的this,arguments,super或   新目标。这些函数表达式最适合非方法   函数,它们不能用作构造函数。

Arrow_functions

您得到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();