我有这个可观察的
createMyRecord(): Observable<myRecord> {
return of(TEMPLATE_DB).pipe(
mergeMap((template) => doTask(template)),
mergeMap(() => EMPTY)
);
}
我用
来称呼它await createMyRecord().toPromise();
.toPromise() 已弃用,所以我想用 lastValueFrom() 更改调用:
await lastValueFrom(createMyRecord());
但我收到以下错误:
EmptyError
no elements in sequence
更新:目前已解决:
await lastValueFrom(createMyRecord()).catch((err) => {
if (err instanceof EmptyError) {
log.info("OK");
}
});
但是有更好的解决方案吗?
lastValueFrom
现在将配置参数作为其第二个参数,并且您可以指定一个默认值,如果可观察对象为空,则将发出该默认值:
await rxjs.lastValueFrom(observableThing, {defaultValue: "oh no - empty!"})
是和不是。
在您的情况下,
mergeMap(_ => EMPTY)
将确保您的可观察对象在不发出值的情况下完成。 Promise 会解析为一个值,否则就会出错。因此,这里唯一要做的符合规范的事情就是抛出错误。
你可以通过发出一些东西来回避这个问题。例如,这里我在源完成后发出
null
:
createMyRecord(): Observable<myRecord> {
return of(TEMPLATE_DB).pipe(
mergeMap((template) => doTask(template)),
mergeMap(() => EMPTY),
s => concat(s, of(null as myRecord))
);
}
现在,一旦可观察对象成功完成,您的承诺就会以
null
解决。
您可以更改调用方式,而不是更改代码。这样您就无需担心
Observables
和 Promises
如何交互。
代替
await lastValueFrom(createMyRecord());
写:
createMyRecord().subscribe();