Twin 订阅区块分叉加入订阅
Twin subscribes block forkJoin subscription
这是测试,在任何 angular 组件的 ngInit 中:
console.log('a');
observableFoo$.subscribe(x => console.log('b'));
observableNotFoo$.subscribe(() => console.log('c'));
forkJoin([
observableFoo$,
observableNotFoo$
]).subscribe(([foo, ntFoo]) => {
console.log('d');
});
ObservableFoo$ 将触发 2 次,这是我需要的行为,这个 observable 将观察到一个可以在初始化期间快速更改的值。
结果是:
a
b
b
c
而且我从不登录。
所以,我首先尝试做同样的事情,但只使用 ObservableNotFoo$ 只是为了确保我可以在单个 Observable 上进行 forkJoin(无用但有效),然后我用 ObservableFoo$ 尝试了同样的事情但它不起作用。
forkJoin 似乎不接受会触发两次的订阅。是这样吗?好像真的很奇怪...
** 编辑:**
observableFoo$ = initFoo(this.id);
observableNotFoo$ = of('notFoo');
initFoo(id: string): Observable<any> {
const content = this.store.select({
filterBy: entity => entity.id === id
}).pipe(
flatMap(v => {
const value = v[0];
if (!value) {
return httpRequest.get(this.baseUrl + '/' + id).pipe(map(val => {
this.store.add(val);
return val;
}));
}
return of(value);
})
);
return content;
}
}
forkJoin
等待所有可观察对象完成,直到那时它不会发出任何东西,正如此处文档中所说:https://rxjs-dev.firebaseapp.com/api/index/function/forkJoin
请考虑使用:
combineLatest
如果你希望它在任何时候都被触发
observables 发出一些东西。 Link
withLatestFrom
如果你想让它开火
当其中一个可观察对象发出某些东西时(第一个)。 Link
zip
如果你想组合每一对 Link
为了用 forkJoin
完成它,您必须完成两个 observables,可以通过多种方式完成,例如使用 take(n)
、takeUntil($end)
或takeWhile(x => x > 5)
等。在最后一次观察完成后,您将在控制台中看到 'd'。
在此场景中,Observables 未完成。 ForkJoin
通常用于已完成的可观察对象,即 HTTP 请求。
因此对于这种情况,您可以使用CombineLatest
。
combineLatest(observableFoo$, observableNotFoo$).subscribe(([foo, ntFoo]) => {
console.log(foo, ntFoo);
})
欲了解更多信息,请访问:combineLatest
这是测试,在任何 angular 组件的 ngInit 中:
console.log('a');
observableFoo$.subscribe(x => console.log('b'));
observableNotFoo$.subscribe(() => console.log('c'));
forkJoin([
observableFoo$,
observableNotFoo$
]).subscribe(([foo, ntFoo]) => {
console.log('d');
});
ObservableFoo$ 将触发 2 次,这是我需要的行为,这个 observable 将观察到一个可以在初始化期间快速更改的值。
结果是:
a
b
b
c
而且我从不登录。 所以,我首先尝试做同样的事情,但只使用 ObservableNotFoo$ 只是为了确保我可以在单个 Observable 上进行 forkJoin(无用但有效),然后我用 ObservableFoo$ 尝试了同样的事情但它不起作用。
forkJoin 似乎不接受会触发两次的订阅。是这样吗?好像真的很奇怪...
** 编辑:**
observableFoo$ = initFoo(this.id);
observableNotFoo$ = of('notFoo');
initFoo(id: string): Observable<any> {
const content = this.store.select({
filterBy: entity => entity.id === id
}).pipe(
flatMap(v => {
const value = v[0];
if (!value) {
return httpRequest.get(this.baseUrl + '/' + id).pipe(map(val => {
this.store.add(val);
return val;
}));
}
return of(value);
})
);
return content;
}
}
forkJoin
等待所有可观察对象完成,直到那时它不会发出任何东西,正如此处文档中所说:https://rxjs-dev.firebaseapp.com/api/index/function/forkJoin
请考虑使用:
combineLatest
如果你希望它在任何时候都被触发 observables 发出一些东西。 LinkwithLatestFrom
如果你想让它开火 当其中一个可观察对象发出某些东西时(第一个)。 Linkzip
如果你想组合每一对 Link
为了用 forkJoin
完成它,您必须完成两个 observables,可以通过多种方式完成,例如使用 take(n)
、takeUntil($end)
或takeWhile(x => x > 5)
等。在最后一次观察完成后,您将在控制台中看到 'd'。
在此场景中,Observables 未完成。 ForkJoin
通常用于已完成的可观察对象,即 HTTP 请求。
因此对于这种情况,您可以使用CombineLatest
。
combineLatest(observableFoo$, observableNotFoo$).subscribe(([foo, ntFoo]) => {
console.log(foo, ntFoo);
})
欲了解更多信息,请访问:combineLatest