在一个RxJS主题的订阅回调中,我想在一个async
函数上使用await
。下面是一个代码示例, typescript 转发器抱怨说:
错误:(131,21)TS2304:找不到名称“wait”。
async ngOnInit() {
this.subscriber = dateSubscription.subscribe((date: Date) => {
let dbKey = await this._someService.saveToDatabase(someObject);
// wait for db write to finish before evaluating the next code
// ... some other code here
});
}
通常我在尝试在非async
函数中调用wait时会看到这种情况。我是否需要进行订阅回调async
还是我做错了?函数saveToDatabase
是async
,并返回解析到写入的数据库主键的承诺。
9条答案
按热度按时间ss2ws0br1#
您可以直接将异步签名添加到订阅中的匿名函数调用中
kgqe7b3p2#
您不需要使用
await
,也不需要将Promise
转换为Observable
。请参见Ben Lesh的此Tweet:
下面是一个模拟
saveToDatabase
函数的例子:输出:
ddarikpa3#
**更新:**发现easy for one time承诺只需在订阅者(blog)前面使用
toPromise
。因此,对于上述情况,它将是这样的:**老办法:**这是我解决这个问题的方法
我现在要做的是把可观察性变成承诺
注:这里唯一的问题是这是一次性显示,即如果你订阅一次,你将无法再次访问它。适合我在这里分享。
7eumitmz4#
您不能直接
await
观察值,但可以await
和Promise
。更新
.toPromise()
方法在RxJS 8中被 * 弃用 *,因此您可以使用lastValueFrom()
或firstValueFrom()
。感谢罗伯特·伦德尔的评论。
RxJS v8之前
您可以简单地对Observables订阅使用
.toPromise()
方法。当你
await
dateSubscription
的承诺时,你会得到一个Date
对象,然后你可以继续执行下一行,这使得你的代码阅读更有顺序性。有些人认为Angular 不会等待
ngOnInit
完成,它没有选择。请看一下从这里给定的TypeScript
生成的JavaScript
。ngOnInit
将调用内部管理和执行底层状态机的等待器(生成器)。Angular对此没有任何控制。它只是希望调用该方法。06odsfpq5#
2022年的Rxjs:使用
pipe
和concatMap
最后,我在这里寻找在监听下一个发布项之前等待处理昂贵项的能力,我不得不将
subscribe
处理程序中的async
代码修改为按照this other similar SO question使用pipe
和concatMap
。旧代码,在处理新项之前不等待对项的昂贵调用(因此在我的例子中存在大量争用条件):
新代码,在处理下一个项目之前等待昂贵的函数。
在处理完可观察对象之前,一定要保留对
subscription
的引用(它不是订阅者)。4xy9mtcn6#
我也有类似的等待响应的需求,而不是在Observable实现中使用
await
或setTimeout()方法,现在更干净的方法是在完成订阅之前使用RxJS内置的interval()
方法。在服务中尝试此操作:
RxJS文档:https://rxjs-dev.firebaseapp.com/guide/subject#reference-counting
希望有点帮助,如果有人试图这样做最近。
cngwdvgl7#
我刚刚编写了一个TaskQueue,以确保订阅中的异步函数可以逐个执行。
查看演示:Code Sandbox
vybvopom8#
这些答案似乎都没有充分回答OP最初的问题。下面是我使用
async
/await
的简单解决方案,这些回调函数是使用IIFEs时可观察到的。输出:
注意
complete
回调函数在next
回调函数完成执行之前被调用。当next
函数包含异步活动并且无法避免时,rxjs
observable函数就是这样工作的。如果你需要在next
函数完成之后调用complete
函数,你需要创建自己的Observable实现或等价的实现。nxagd54h9#
async ngOnInit() { }
是不正确的签名,因为这是Angular定义OnInit
接口的方式。它应该返回void
:如果在
dateSubscription
之后有任何处理承诺,可以使用Observable.fromPromise
,如