【问题标题】:.toPromise() and lastValueFrom() in rxjsrxjs 中的 .toPromise() 和 lastValueFrom()
【发布时间】:2021-08-26 13:41:01
【问题描述】:

我有这个可观察的

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


    【解决方案1】:

    有更好的解决方案吗?

    是和不是。

    在您的情况下,mergeMap(_ =&gt; EMPTY) 将确保您的 observable 在不发出值的情况下完成。 Promise 解析为一个值,否则它们会出错。所以这里唯一符合规范的就是抛出一个错误。

    一种解决方法

    你可以通过发射一些东西来回避这个问题。例如,这里我在源代码完成后发出null

    createMyRecord(): Observable<myRecord> {
      return of(TEMPLATE_DB).pipe(
        mergeMap((template) => doTask(template)),
        mergeMap(() => EMPTY),
        s => concat(s, of(null as myRecord))
      );
    }
    

    现在,一旦 observable 成功完成,您的 promise 将使用 null 解决。

    地道的东西

    您可以更改调用方式,而不是更改代码。这样您就不必担心ObservablesPromises 的交互方式。

    而不是await lastValueFrom(createMyRecord()); 写:

    createMyRecord().subscribe();
    

    【讨论】:

    • @user1:当然。添加了另一个根本不需要更改可观察代码的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2019-10-14
    • 2021-07-06
    • 2016-11-28
    • 2018-05-22
    • 1970-01-01
    • 2022-01-01
    • 2017-02-15
    • 1970-01-01
    相关资源
    最近更新 更多