Javascript 为什么在解析异步调用之前返回值,即使在使用async/await时也是如此?

Javascript 为什么在解析异步调用之前返回值,即使在使用async/await时也是如此?,javascript,typescript,asynchronous,Javascript,Typescript,Asynchronous,以下函数在this.codesService.getCostCodes解析之前返回承诺,导致未定义 async getTopParentByChildId(id: string) { let parent; await this.codesService.getCostCodes().subscribe( data => { parent = data.body[0]; }); return new Promise<BidItem&

以下函数在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);
    });

  }
我读过很多关于async/await和Promissions的书,但到目前为止,我尝试过的解决方案都不适用于我。当我使用async/await关键字时,我无法理解为什么它不等待异步函数解析。

您可以等待承诺,就是这样。你不能等待一个rxjs订阅,甚至是一个RXJSObservable,这会让你有更多的理由去尝试,但仍然不起作用

您可以重构gettopparentbychildie,从而删除异步/等待,因为它们不是必需的

getTopParentByChildId(id: string) {
  return this.codesService.getCostCodes()
    .pipe(map(data => data.body[0]))
    .toPromise();
}
您可以重构PopulateBiItemObjectArray以实现此目的

你可以等待承诺,就是这样。你不能等待rxjs订阅,甚至是rxjs observable,这样做会更有意义。在这里使用新承诺没有任何意义。您可能希望执行return Promise.resolveparent,但即使这样也没有必要-在异步函数中,您可以只编写return parent;。
getTopParentByChildId(id: string) {
  return this.codesService.getCostCodes()
    .pipe(map(data => data.body[0]))
    .toPromise();
}
populateBidItemObjectArray(node) {
  return this.getTopParentByChildId(node.id)
    .then(_ => {
      return {
          name: _.name,
          id: _.id
        };
    });
}