使用 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 示例。
我有两个需要按顺序执行的承诺。他们成功完成后,我想发出 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 示例。