CombineLatest,仅在所有可观察对象完成后执行一次
CombineLatest, execute only once after all observables are complete
我正在尝试解决一个问题。目前,我正在打开一个模式,但为此我需要 3 条路线 observables 的组合。所以,我的代码逻辑是这样的:
combineLatest([obs1, obs2, obs3])
.subscribe(([s1, s2, s3]: any) => {
openModal();
});
因为它将被执行 3 次,我的模式也将被打开 3 次,但我不希望它这样做,但我知道这是预期的行为。
因此,为此,我实施的糟糕的解决方案使用的是 flag
,如下所示:
let shouldOpen = true;
combineLatest([obs1, obs2, obs3])
.subscribe(([s1, s2, s3]: any) => {
if(shouldOpen) {
shouldOpen = false;
openModal();
}
});
当然,这不是一个好的解决方案。
所以,问题 是,有没有办法让我继续使用 combineLatest
但只执行一次 ?
如果您想尝试使用 combineLatest,这里是 Stackblitz。
Note: I cannot use forkJoin
or zip
, I already tried those.
因为你不能使用 forkJoin
(这是正确的答案),跳过 combineLatest
的前两个排放
combineLatest([obs1, obs2, obs3])
.pipe(skip(2))
.subscribe(([s1, s2, s3]: any) => {
openModal();
});
您也可以使用 skipWhile
跳过,直到所有三个都被定义:
.pipe(skipWhile(([s1, s2, s3]) => s1===undefined || s2 === undefined || s3===undefined))
我正在尝试解决一个问题。目前,我正在打开一个模式,但为此我需要 3 条路线 observables 的组合。所以,我的代码逻辑是这样的:
combineLatest([obs1, obs2, obs3])
.subscribe(([s1, s2, s3]: any) => {
openModal();
});
因为它将被执行 3 次,我的模式也将被打开 3 次,但我不希望它这样做,但我知道这是预期的行为。
因此,为此,我实施的糟糕的解决方案使用的是 flag
,如下所示:
let shouldOpen = true;
combineLatest([obs1, obs2, obs3])
.subscribe(([s1, s2, s3]: any) => {
if(shouldOpen) {
shouldOpen = false;
openModal();
}
});
当然,这不是一个好的解决方案。
所以,问题 是,有没有办法让我继续使用 combineLatest
但只执行一次 ?
如果您想尝试使用 combineLatest,这里是 Stackblitz。
Note: I cannot use
forkJoin
orzip
, I already tried those.
因为你不能使用 forkJoin
(这是正确的答案),跳过 combineLatest
combineLatest([obs1, obs2, obs3])
.pipe(skip(2))
.subscribe(([s1, s2, s3]: any) => {
openModal();
});
您也可以使用 skipWhile
跳过,直到所有三个都被定义:
.pipe(skipWhile(([s1, s2, s3]) => s1===undefined || s2 === undefined || s3===undefined))