.toPromise() 和 lastValueFrom()

问题描述 投票:0回答:2

我有这个可观察的

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

但是有更好的解决方案吗?

javascript promise rxjs
2个回答
8
投票

lastValueFrom
现在将配置参数作为其第二个参数,并且您可以指定一个默认值,如果可观察对象为空,则将发出该默认值:

await rxjs.lastValueFrom(observableThing, {defaultValue: "oh no - empty!"})

3
投票

有更好的解决方案吗?

是和不是。

在您的情况下,

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();
© www.soinside.com 2019 - 2024. All rights reserved.