Используйте функции стрелок ECMAScript 6 в качестве методов класса - PullRequest
0 голосов
/ 23 декабря 2018

Я тестирую свой код с узлом 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();

Так как можноЯ использую методы класса в обещаниях?

Есть еще один вопрос относительно этой темы: Как использовать функции стрелок (открытые поля класса) в качестве методов класса? К сожалению, это не работаетс моей настройкой node.js.

Ответы [ 3 ]

0 голосов
/ 23 декабря 2018

Правильно, это потому, что ваш контекст неверен в вашем обещании.Один из способов - привязать this к вашему контексту Promise.В вашем примере вы бы назвали его как fsp.readdir('.').then(this.promiseMe.bind(this));

В качестве альтернативы, если вы используете это чаще, вы можете связать его в своем конструкторе:

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

Это свяжет его вваш класс, так что вам больше не нужно связываться каждый раз, когда вы звоните!

0 голосов
/ 23 декабря 2018

Похоже, вы уже выяснили, какие у вас есть варианты, когда дело доходит до синтаксиса 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();
0 голосов
/ 23 декабря 2018

Выражение функции со стрелкой имеет более короткий синтаксис, чем выражение функции, и не имеет собственного this, arguments, super или new.target.Эти функциональные выражения лучше всего подходят для функций, не относящихся к методам, и их нельзя использовать в качестве конструкторов.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions

Вы получаете TypeError: Cannot read property 'attr' of undefined, поскольку this нессылаясь на ваш экземпляр класса.

...