【问题标题】:Typescript async/await with Observable Or Promise带有 Observable 或 Promise 的 Typescript async/await
【发布时间】:2023-03-10 17:00:01
【问题描述】:

我可以像这样使用asyncawait 吗?我在这里杀死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));

【问题讨论】:

  • 你想做什么?
  • 可以这样做但是you shouldn't
  • 你为什么要await 一个(同步!)分配?

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


【解决方案1】:

您可以按照您的方式使用async 函数,但它在您的示例中不起作用。你要明白async函数返回一个promise:

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);
  });

【讨论】:

  • 那么在订阅声明之前我该如何等待do((dto: DtoModel) =&gt; this.subject.next(dto.content))?我有这个主题的TODO。我不知道需要多长时间才能完成,所以我不能与.delay(...) 链接有没有更好的方法等到第一个语句完成后再下一个?谢谢。
  • 为什么要等呢?它会返回任何值吗?
  • 它不返回任何东西。主题从do(...) 发送新值,主题订阅了角度组件以在模板上更改数据。所以我必须等到角度扫描并从changeDetecoterRef 完成。我的组件更改检测策略是默认的。如果我与.delay(..) 链接,则第二个语句值绑定到角度,但如果我删除,则不应用第二个值。
  • @Robin,对不起,我不明白。我的回答有什么不清楚的地方?
  • @Maximus 我理解了你上面的答案示例,但我的问题没有解决。我的意思是如何告诉角度变化检测foo[] 正在处理,而bar[] 已更新并呈现在视图中?等到foo[]bar[] 完成,然后开始渲染到视图/组件等。就像我有&lt;div *ngFor="let f of foo"&gt;&lt;div *ngIf="bar.length&gt; 0 &amp;&amp; getFromBar(f.id)"&gt; 那么我如何同步链接和执行?谢谢。
猜你喜欢
  • 2020-02-05
  • 1970-01-01
  • 2018-02-05
  • 2016-02-26
  • 2019-05-08
  • 2018-05-18
  • 2017-09-12
  • 2015-11-13
  • 1970-01-01
相关资源
最近更新 更多