我使用Redux和RxJS Angular(4)实现来管理状态&动作重新进入我的应用程序。
我正在收听一个事件(产品列表中所选产品ID的更改),因此我们将其称为selectedProductId$
。
当相关的发射器发出一个新的selectedId值时,我想从这个Observable值中做一个switchMap
,以及来自另外两个Observable的最新发射值(让我们说; {{1} }和productDetails$
)。
所以"触发变化"应该是selectedProductID,我们会使用productDetails和productComments的最新值进行productComments$
。
我试过了:
switchMap
然后我订阅了这个observable并在传递的值上设置了一个断点:
// subscribed to the 3 observable passed in combineLatest
fetchProduct$: Observable<any>;
this.fetchProduct$ = Observable.combineLatest(
this.selectedProductId$,
this.productComments$,
this.productDetails$
).switchMap(
result => Observable.of(
{
'uuid': result[0],
'comments': result[1],
'details': result[2]
}
)
);
它可以工作,但每次三个Observable中的一个检测到状态变化时都会调用它。我也尝试了Observable.forkJoin,但是从文档中,它等待三个Observable发出新值,这使我变得怪异,因为我从另一个Webservice获得注释,并且它可以在选择下一个产品Id时检索它。
Observable.merge也不是一个解决方案,因为它只会在一个&#34;频道&#34;上一个接一个地发出值。
我并不完全习惯于反应式编程,也许我没有清楚地看到一个明显的解决方案,但是我知道我会喜欢暗示或帮助解决这个问题:( 非常感谢
答案 0 :(得分:2)
尝试withLatestFrom
,其工作方式类似于combineLatest()
,但每次源可观察性触发时都会触发。示例(对于rxjs 5.5):
this.fetchProduct$ =
this.selectedProductId$.pipe(
withLatestFrom(
this.productComments$,
this.productDetails$
));
或者对于早期版本:
this.fetchProduct$ =
this.selectedProductId$.withLatestFrom(
this.productComments$,
this.productDetails$
);
答案 1 :(得分:1)
首先,让我们合并您不想触发任何更改的“额外”可观察量。
const extras$ = Observable.combineLatest(this.productComments$, this.productDetails$);
现在,我们在“有趣”的观察中观察排放,并使用我们的额外值中的最新值。
cosnt allTogether$ = this.selectedProductId$.withLatestFrom(extras$,
([uuid, [comments, details]]) => ({uuid, comments, details}) );
现在可以订阅allTogether$
。