Наследование машинописи и обещания: как получить разрешенное обещание в подклассе - PullRequest
0 голосов
/ 07 октября 2018

У меня есть три класса: базовый класс Animal и подкласс Cat и класс приложения:

Класс приложения вызывает класс Animal, который извлекает данные, класс Catследует отфильтровать данные и получить данные, относящиеся только к данным Cat.

App.ts

Разрешает обещание и должно получить кошек, но становится неопределенным, поскольку подкласс создается до разрешения обещания;

this._cats = new Cats();
this._cats.fetchAnimalData().then(() => {
     this._cats.getCats(); // returns undefined
});

Animal.ts FetchesДанные о животных

    private async _setAnimalsDataContract(): Promise<[]> {
        return await ...;
    }
    public getAnimalData() {
        return this._animalData;
    }
    public setAnimalData(data) {
        this._animalData = data;
    }
    public fetchAnimalData() : Promise<void> {
        return this._animalDataPromise
                .then((dataSet: IAnimal;[]) => {
                   this._setAnimalData(dataSet);
                }).catch(() => {
                    throw new Error('...');
                });
   }

Cat.ts getAnimalData не определена, поскольку базовый класс не завершил выборку

export default class Cat extends Animal {
    constructor() {
       super();
       this._catData = (this._formatCatData(this.getAnimalData()));
    }
    getCats() {
       return this._catData;
    }
}

Я, конечно, мог бы создать экземпляр класса Animal, дождаться разрешения обещания, а затем создать экземпляр класса Cat.внутри then но тогда вообще не имеет смысла делать расширение класса.

Как получить данные обещания базового класса в подклассе после его завершения?

1 Ответ

0 голосов
/ 07 октября 2018

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

 class Animal {
   get data() {
      return this._promise || (this._promise = fetchAnimalData());
   }
}

class Cat extends Animal {
 get cats() {
   return this.data.then(data => /*...*/);
 }
}

const cat = new Cat();
cat.cats.then(console.log);

Но я не знаю, зачем вам вообще нужен класс ...

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