Почему значение возвращается до разрешения асинхронного вызова, даже при использовании async / await? - PullRequest
0 голосов
/ 01 июля 2019

Следующая функция возвращает Обещание до разрешения this.codesService.getCostCodes(), что приводит к неопределенности

  async getTopParentByChildId(id: string) {
    let parent;

    await this.codesService.getCostCodes().subscribe( data => {
      parent = data.body[0];
    });

    return new Promise<BidItem>(resolve => {           //returning `parent` results in the same issue
      resolve(parent);
    });

  }

getTopParentByChildId() вызывается другой асинхронной функцией, которая имеет ту же проблему, где она возвращает неопределенное значение перед разрешением асинхронного вызова:

  async populateBidItemObjectArray(node){
    const parent = await this.getTopParentByChildId(node.id);    //should wait for function to return before executing the rest

    const bidItem = {
      name: parent.name,
      id: parent.id
    };

    return new Promise<BidItem>(resolve => {     //returns undefined before this.getTopParentByChildId is resolved
      resolve(parent);
    });
  }

Я много читал об асинхронных / ожидающих и обещаниях, но ни одно из решений, которые я пробовал, до сих пор не работало для меня. Я не могу понять, почему он не ожидает разрешения асинхронных функций при использовании ключевых слов async / await.

1 Ответ

1 голос
/ 01 июля 2019

Вы можете await a Promise и все.Вы не можете ждать подписку на rxjs (или даже наблюдаемую rxjs, в которой было бы больше смысла попробовать, но она все равно не работала).

Вы можете изменить рефакторинг getTopParentByChildId на это, что удаляет асинхронную / awaitпоскольку они не нужны.

getTopParentByChildId(id: string) {
  return this.codesService.getCostCodes()
    .pipe(map(data => data.body[0]))
    .toPromise();
}

Вы можете рефакторировать populateBidItemObjectArray к этому.

populateBidItemObjectArray(node) {
  return this.getTopParentByChildId(node.id)
    .then(_ => {
      return {
          name: _.name,
          id: _.id
        };
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...