Не уверен, как заполнить массив в методе, в котором есть Promises - PullRequest
0 голосов
/ 03 января 2019

У меня есть метод, который выполняет некоторые базовые математические вычисления в моем приложении Ionic после извлечения данных из базы данных SQLite. Я хочу показать эти результаты на странице, но проблема в том, что я не уверен, как поместить все эти вычисленные значения в массив объектов.

Я пытался следовать, но редактор жалуется на невыполнение обещаний. Мне кажется, что я уже решил их, извлекая числовое значение из каждого и назначая их локальным переменным, таким как grossMarketable, aphMarketable, amountSold и totalContractDollarAmount.

home.ts

private calculate() {
    console.log("**********Starting calculations now.....");
    let calculations: CalcModel[] = [];
    for (let i = 0; i < this.userCropTxModels.length; i++) {
      let userCropTxModel = this.userCropTxModels[i];
      console.log("userCropTxModel: " + userCropTxModel);

      let grossMarketable = this.userCropProvider.getGrossMarketableByCropId(userCropTxModel.cropId)
        .then(grossMarketable => {
          console.log("grossMarketable: " + grossMarketable);
          return grossMarketable;
        })
        .catch((e) => console.error(JSON.stringify(e)));

      let aphMarketable = this.userCropProvider.getAPHMarketableByCropId(userCropTxModel.cropId)
        .then(aphMarketable => {
          console.log("aphMarketable: " + aphMarketable);
        })
        .catch((e) => console.error(JSON.stringify(e)));

      let amountSold = this.userContractProvider.getTotalContractedBushelsByCropId(userCropTxModel.cropId)
        .then(amountSold => {
          console.log("amountSold: " + amountSold);
        })
        .catch((e) => console.error(JSON.stringify(e)));

      let totalContractDollarAmount = this.userContractProvider.getTotalContractDollarAmountByCropId(userCropTxModel.cropId)
        .then(totalContractDollarAmount => {
          console.log("totalContractDollarAmount: " + totalContractDollarAmount);
        })
        .catch((e) => console.error(JSON.stringify(e)));

      console.log("grossMarketable: " + grossMarketable);
      console.log("aphMarketable: " + aphMarketable);
      console.log("amountSold: " + amountSold);
      console.log("totalContractDollarAmount: " + totalContractDollarAmount);

      /**************************************************
      //THE EDITOR IS SHOWING RED MARKS BELOW
      ***********************************************/
      calculations.push({
        cropName: 'Corn',
        grossMarketable: grossMarketable,
        grossMarketable: grossMarketable,
        amountSold: amountSold,
        totalContractDollarAmount: totalContractDollarAmount
      });
    }
    console.log("calculations: " + calculations);
  }

user-crop.ts (фрагмент кода UserCropProvider)

getGrossMarketableByCropId(cropId: number): Promise<number> {
    return this.databaseProvider.getDatabase().then(database => {
      return database.executeSql(SQL_SELECT_GROSS_MARKETABLE_BY_CROP_ID, [cropId])
        .then((data) => {
          let grossMarketable: number = 0;
          for (let i = 0; i < data.rows.length; i++) {
            grossMarketable = data.rows.item(i).GROSS_MARKETABLE
          }
          return grossMarketable;
        });
    });
  }

CalcModel.ts

export interface CalcModel {
  cropName: string;
  grossMarketable: number; 
  aphMarketable: number; 
  amountSold: number; 
  totalContractDollarAmount: number; 
}

1 Ответ

0 голосов
/ 03 января 2019

Создайте promise.all для каждой модели обрезки пользователя, включив в список обещаний ваши асинхронные запросы.

Когда вы решите внутренние, верните один объект расчета. Когда вы решите все из них, получите список расчетов:

Ваш код должен выглядеть примерно так:

private calculate() {
    const promises: Promise<any>[] = []; 
    for (let i = 0; i < this.userCropTxModels.length; i++) {
      let userCropTxModel = this.userCropTxModels[i];
      promises.push(Promise.all([
        this.userCropProvider.getGrossMarketableByCropId(userCropTxModel.cropId),
        this.userCropProvider.getAPHMarketableByCropId(userCropTxModel.cropId),
this.userContractProvider.getTotalContractedBushelsByCropId(userCropTxModel.cropId),
this.userContractProvider.getTotalContractDollarAmountByCropId(userCropTxModel.cropId)
      ]).then(data => ({ 
        cropName: 'Corn',
        grossMarketable: data[0],
        amountSold: data[1],
        totalContractDollarAmount: data[2]
      })));
    }
    Promise.all(promises).then(calculations => console.log(calculations));
  }

EDIT

Немного рефакторинга. Я не знаю, работает ли это, я просто пишу код, даже не пытаясь, но немного чище:

private calculate() {
  const promises: Promise<any>[] = this.userCropTxModels.map(userCropModel => Promise.all([
    this.userCropProvider.getGrossMarketableByCropId(userCropModel.cropId),  
    this.userCropProvider.getAPHMarketableByCropId(userCropModel.cropId),
    this.userContractProvider.getTotalContractedBushelsByCropId(userCropModel.cropId),
    this.userContractProvider.getTotalContractDollarAmountByCropId(userCropModel.cropId)
  ]).then(data => ({
    cropName: 'Corn',
    grossMarketable: data[0],
    amountSold: data[1],
    totalContractDollarAmount: data[2]
  })));
  Promise.all(promises).then(calculations => console.log(calculations));
}

Вы даже можете использовать async / await, если хотите написать код синхронизации / стиля

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