Javascript Typescript async/await,带有可观察或承诺

Javascript Typescript async/await,带有可观察或承诺,javascript,node.js,angular,typescript,async-await,Javascript,Node.js,Angular,Typescript,Async Await,我可以像这样使用async和wait吗?我是否在这里终止了async/await? 下面的代码工作正常,我知道async/await只适用于Promise。我的getItem是一个可观察的。谢谢 roleService.getItem({ page: p.pageIndex + 1, pageSize: p.pageSize }) .takeUntil(this.unsubscribe$) .map((res: ResponseDto) => <DtoModel>res.con

我可以像这样使用
async
wait
吗?我是否在这里终止了
async/await
? 下面的代码工作正常,我知道
async/await
只适用于
Promise
。我的
getItem
是一个
可观察的
。谢谢

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));
roleService.getItem({page:p.pageIndex+1,pageSize:p.pageSize})
.takeUntil(此.unsubscribe$)
.map((res:ResponseDto)=>res.contentBody)
.do(异步(dto:DtoModel)=>等待此.subject.next(dto.content))//工作时出错
.subscribe(异步(dto:DtoModel)=>await(this.pager=dto.pager),//正常工作
(错误:any)=>可观察到的抛出(错误));

您可以按您的方式使用
异步
函数,但在您的示例中没有效果。您必须了解
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`
  });
因此,如果你在可观察链中使用它,你将得到一个承诺:

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)=>this.subject.next(dto.content))
在subscribe语句之前?关于那个题目,我有
要做的事。我不知道需要多长时间才能完成,所以我无法与
链接。延迟(…)
是否有更好的方法等待第一条语句完成后再下一条语句?谢谢。你为什么要等呢?它是否返回任何值?它不返回任何值。受试者从
do(…)
发送新值,其中受试者订阅了用于模板上数据更改的角度分量。因此,我必须等待角度扫描并从
changedetectoterref
完成。默认情况下,我的组件更改检测策略。如果我使用
.delay(..)
链接,则第二个语句值将绑定到angular,但如果我删除,则第二个值不会应用。@Robin,对不起,我不明白。我的答案有什么不清楚的地方?@Maximus我理解你上面的答案,但我的问题没有解决。我的意思是如何告诉角度变化检测,
foo[]
正在处理,而
bar[]
正在更新并在视图中呈现?等待
foo[]
bar[]
完成,然后开始渲染视图/组件等。就像我有
&
那么我如何同步链接和执行?谢谢