Как разрешить обещание в классе метод getter в машинописи - PullRequest
0 голосов
/ 06 октября 2018

У меня есть два класса, где я получаю продукты из класса продуктов, используя функцию async / await.

export default class Products {
   async getProducts() : Promise<[]> {
        return await import('../data/products.json');
   }
}

export default class App {
    render() {
        this.products = new Products();
        this.products.getProducts().then((productsData) => {
            // Do stuff
        });
    }
}

Это отлично работает, но я хочу изменить данные в классе продуктов, прежде чем я получу их в классе App.Я попытался изменить getProducts на setProduct, где я устанавливаю продукты в consturctor и получаю их следующим образом:

   async setProducts() : void {
        this.products = await import('../data/products.json');
   }
   public getProducts(): [] {
        return this.products;
   }

Проблема в том, что когда я вызываю getProducts, он еще не завершил выборку, и я получаю неопределенное значение вкласс приложения.

Итак, я попытался сделать следующее:

   public getProducts(): [] {
        let products: [];
        return this.products.then(dataSet => {
            products = dataSet;
        });
        return products;
   }

Что также привело к неопределенности

Как я мог заставить мой класс или получателя дождаться завершения импорта товаров, поэтому мой метод получения всегдавернуть импортированные данные вместо неопределенных?

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

1 Ответ

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

Вы можете попытаться вернуть обещание из метода getProducts, например:

 public getProducts(): [] {
    let products: [];
    return new Promise(function(resolve, reject) {
       this.products.then(dataSet => {
         products = dataSet;
         resolve(products)
       });
    });
 }     

Оператор «Проблема в возвращении» выполняется даже до того, как будет извлечен dataSet.Это базовое асинхронное поведение.Один из способов решить эту проблему - вернуть Обещание

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