打字稿async / await with Observable或Promise

时间:2017-07-25 10:33:39

标签: javascript node.js angular typescript async-await

我可以像这样使用async await吗?我在这里杀了async/await吗? 以下代码正常运行,我知道async/await仅适用于Promise<T>。我的getItemObservable。感谢。

roleService.getItem({ page: p.pageIndex + 1, pageSize: p.pageSize })
.takeUntil(this.unsubscribe$)
.map((res: ResponseDto) => <DtoModel>res.contentBody)
.do(async (dto: DtoModel) => await this.subject.next(dto.content)) // working wihtout error
.subscribe(async (dto: DtoModel) => await (this.pager = dto.pager), //working without error
          (error: any) => Observable.throw(error));

1 个答案:

答案 0 :(得分:2)

您可以按照您的方式使用async功能,但在您的示例中它不起作用。您必须了解async函数返回一个承诺:

const fn = async function() {};
fn() instanceof Promise

因此,如果您在可观察链中使用它,您将收到一个承诺:

interval(500)
  .first()
  .map(async (v) => {
    return v;
  })
  .subscribe((v) => {
    console.log(v instanceof Promise); // logs `true`
  });

您构建示例的方式不会对observables链产生任何影响,因为do运算符的输出被忽略,并且subscribe的输出没有监听器} 打回来。所以基本上没有理由在那里使用async

如果您希望等到async函数解析并获取该函数的结果,请使用mergeMap运算符:

interval(500)
  .first()
  .map(async (v) => {
    return v;
  })
  .mergeMap((p) => {
    return p;
  })
  .subscribe((v) => {
    console.log(v);
  });