0

Помогите справиться со следующей проблемой: Есть класс метод которого Initialize() вызывает Promise функцию результат которой я хочу записать в атрибуты класса

module.exports = class MyPokedex {
    constructor() {
        const Pokedex = require('pokedex-promise-v2');
        this._P = new Pokedex();
        this.total = 0;     // How many total pokemons
        this.names = [];    // Name
        this.promiseResolved = false;
    }

    async Initialize() {
        let interval = {
            limit: 1,
            offset: 0
        }
        const self = this;    

        self.promiseResolved = false;
        // Пытаюсь сделать await но эффекта нет ...
        await this._P.getPokemonsList(interval)
        .then( function(response) {
            self.total = response.count;
            for(let line of response.results)
                self.names.push(line.name);           
            self.promiseResolved = true;
        }, (err) => console.log("Промис выполнен с ошибкой", err));

        console.log('finished');
        console.log('this.total', this.total);
        console.log('this.names', this.names.length);
        console.log('this.promiseResolved', this.promiseResolved);
    }
}

// *** pdemo.js ***************************************

const MyPokedex = require('./pclass');
let myP = new MyPokedex();
console.log(myP.promiseResolved);
console.log('Main Initialize');
myP.Initialize();
console.log('Main Initialize finished');
// while (!myP.promiseResolved)
  console.log(myP.promiseResolved);
  console.log(myP.total);

При выполнении node pdemo в консоли вижу следующее:

C:\nodejs\MyPrj\mobx-master>node pdemo
false
Main Initialize
Main Initialize finished
false
0
finished
this.total 964
this.names 2
this.promiseResolved true

Получается что-то странное ?! Вроде бы await срабатывает, но почему тогда внутри pdemo.js значения атрибутов 0 и false (не инициализированы) ?

santavital
  • 1,812
  • Очевидно, потому что перед console.log вы никак не дожидаетесь момента, когда асинхронный Initialize() закончит свою асинхронную работу и проставит атрибуты. – andreymal Feb 13 '20 at 13:18
  • И как мне нужно это сделать ? – santavital Feb 13 '20 at 13:37
  • 1
    Асинхронные функции возвращают промис, который срабатывает, когда функция завершит свою асинхронную работу. Соответственно, вам нужно написать что-то вроде myP.Initialize().then(() => { console.log('Main Initialize finished'); }) и уже внутри then обращаться к атрибутам – andreymal Feb 13 '20 at 13:40
  • @andreymal, либо просто продолжить пользоваться async и await :) – Grundy Feb 13 '20 at 13:43
  • если используешь await, то then особо не нужен – Grundy Feb 13 '20 at 13:43
  • @Grundy но для этого придётся завернуть весь незавёрнутый код в асинхронную функцию – andreymal Feb 13 '20 at 13:58
  • @Grundy А почему этот вопрос до сих пор не задубликачен? :) – Yaant Feb 13 '20 at 14:12
  • @Yaant, с одной стороны лень, с другой не уверен каким именно закрыть :) можешь проголосовать за закрытие я добью :) – Grundy Feb 13 '20 at 14:29

0 Answers0