使用 Rxjs 构建初始化器

Build a initializer with Rxjs

我有两个需要按顺序执行的承诺。他们成功完成后,我想发出 value 并与所有当前和未来的订阅者分享

    concat(
        from(promise1),
        from(promise2)
    ).pipe(
        switchMap(() => of(value))
    ).share()

无效,因为价值发布得太早了。谁能帮忙?

编辑 1:

我找到了可行的解决方案。有没有更好的方法?

    const initializer = 
        concat(from(promise1), from(promise2))
        .pipe(
            last(),
            switchMap(() => of(value)),
            shareReplay(1)
        );

尝试Promise.all

from(Promise.all(p1, p2)).pipe(map(() => value))

或者只使用 forkJoin 而不是 concat

由于顺序对您很重要,您可以使用 switchMap:

简单地将调用链接在一起
const initializer = defer(() => promise1()).pipe(
  switchMap(val1 => promise2()),
  map(val2 => '(value from initializer)'),
  shareReplay(1)
);

我们使用 defer 来防止承诺在有订阅者之前执行。

switchMap 会将传入的发射(来自 promise 1 的值)映射到 promise 2。它将发射来自 promise 2 的解析值。

如果你有更多的承诺要添加到链中,你可以简单地添加更多 switchMap:

const initializer = defer(() => promise1()).pipe(
  switchMap(val1 => promise2()),
  switchMap(val2 => promise3()),
  switchMap(val3 => promise4()),
  map(val4 => '(value from initializer)'),
  shareReplay(1)
);

这是一个小 StackBlitz 示例。