Как выполнить другую функцию после завершения асинхронного? - PullRequest
2 голосов
/ 17 мая 2019

Я делаю приложение на основе angularjs и машинописи, где в конструкторе я вызываю функцию загрузки, например,

private load(): angular.IPromise<void> {

    const progTokInit: string = 'initial';
    this.$scope.progress.start(progTokInit);

    return this.entityService
      .load(this.$scope.projectRevisionUid)
      .then(resp => { 
         //Doing foreach and sending employeeModel
         //  to get the financetype of the person
         resp.employeeRates.forEach(employeeModel => this.getFinanceType(employeeModel));

         this.refreshCostRate(...resp.employeeRates)
          .then(() => // Another Function )
          .then(() => // Yet Anothoer Function )
     })
}

Здесь мне нужно выбрать финансовый тип человека, для которого, если я отправлю номер МВЗ, я получу данные, поэтому я дал это в функции getFinanceType(),

private getFinanceType (employeeModel:any) {
    this.costService.getFinanceType(employeeModel.person.cost_center.getValue()[0])
        .then((result) => {
          console.log('res ', result);
          employeeModel.financeType = result;
          return result;
        });
}

Эта функция является асинхронной, поэтому будет максимальная задержка для получения всех соответствующих данных, пока мне не придется ждать, чтобы перейти к следующему шагу, т. Е. Мне нужно вызывать this.refreshCostRate(...resp.employeeRates), только если эта текущая функция getFinanceType () завершится. его задача полностью ..

Я пытался использовать async / await вроде,

private async getFinanceType (employeeModel:any) {
    await return this.costService.getFinanceType(employeeModel.person.cost_center.getValue()[0])
        .then((result) => {
          console.log('res ', result);
          employeeModel.financeType = result;
          return result;
        });
}

но ничего не помогает, выполнение продолжается, даже если эти данные не были завершены, поэтому я не могу установить данные employeeModel.financeType в нужное время.

Пожалуйста, помогите мне справиться с этой ситуацией: подождите, пока getFinanceType() не завершит свою работу, затем после выполнения другой функции и еще одной функции.

1 Ответ

0 голосов
/ 17 мая 2019

Измените функцию getFinanceType на возврат обещание:

private getFinanceType (employeeModel:any) {
    var value = employeeModel.person.cost_center.getValue()[0]
    return this.costService.getFinanceType(value)
      .then((result) => {
        console.log('res ', result);
        employeeModel.financeType = result;
        return result;
    });
}

Затем выполните цепочку из возвращенных обещаний:

private load(): angular.IPromise<void> {

    const progTokInit: string = 'initial';
    this.$scope.progress.start(progTokInit);

    return this.entityService
      .load(this.$scope.projectRevisionUid)
      .then(resp => { 
         //Doing foreach and sending employeeModel
         //  to get the financetype of the person
         var promiseArr = resp.employeeRates.map(_ => this.getFinanceType(_));
         promiseArr.push(resp);
         return $q.all(promiseArr);
      })
      .then(financeTypeArr) {
         var resp = financeTypeArr.pop();   
         return this.refreshCostRate(...resp.employeeRates)
          .then(() => // Another Function )
          .then(() => // Yet Anothoer Function )
     })
}

Используйте $q.all длядождитесь возврата всех данных с сервера, прежде чем переходить к следующему шагу.

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