Обратитесь к объекту класса в функции класса, работающей как функция обратного вызова в обещании - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть метод класса, который является функцией обратного вызова в Promise.

myClass.js:

class myClass {

    constructor() {}

    doSomethingAsync(resolve, reject) {        
        let me = this;
        console.log(me); // undefined

        // .... do something that returns either resolve() or reject()

    }

}

export default (new myClass);

app.js

import ClassA from "myClass.js";

new Promise(ClassA.doSomethingAsync).then(() => {
    // .... do something if success ....
    }
}).catch(() => {
    // ... do something if failed ...
})

У меня проблема в том, что me внутри doSometingAsync() должно относиться к ClassA, но отображается undefined. Как я могу сослаться на ClassA внутри этой функции?

Ответы [ 3 ]

0 голосов
/ 06 сентября 2018

Когда вы извлекаете ссылку на функцию и передаете ее чему-то другому, она не сохраняет никаких сведений о том, что это должен быть метод какого-то класса. Это просто ссылка на функцию, которую вызовет другая функция. В результате он не поддерживает привязку к интенсу this. Вы можете поддерживать привязку к экземпляру в явном виде, используя bind()

class myClass {
  constructor() {
    this.name = "mark"
  }

  doSomethingAsync(resolve, reject) {
    let me = this;
    console.log(me); 
  }

}

let ClassA = new myClass

new Promise(ClassA.doSomethingAsync.bind(ClassA)).then(() => {
  // .... do something if success ....

}).catch(() => {
  // ... do something if failed ...
})
0 голосов
/ 06 сентября 2018

Вам необходимо привязать this к функции:

constructor() {
  this.doSomethingAsync = this.doSomethingAsync.bind(this);
}

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

doSomethingAsync = (resolve, reject) => { ... }
0 голосов
/ 06 сентября 2018

использовать функции стрелок:

class myClass {

    constructor() {}

    doSomethingAsync = (resolve, reject) => {        
        let me = this;
        console.log(me);     
    }

}

export default (new myClass);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...