不确定通过的链接是否会引导您找到实际的解决方案,因此我在此处提供有关可能方法的更多详细信息。这个想法是使用运算符groupBy,参见。 https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/groupby.md , http://reactivex.io/documentation/operators/groupby.html 用于弹珠,如果您喜欢这里的测试规格https://github.com/ReactiveX/RxJS/blob/master/spec/operators/groupBy-spec.js)。
假设您有一张按 ID 划分的观察者地图,称为 observers,您可以尝试类似的方法:
collectionSubject = new Rx.Subject();
observers = [0, emits("observer for group 1"), emits("observer for group 2")];
collectionSubject
.concatMap(function ( arr ) {return arr;})
.tap(emits("tap"))
.groupBy(function ( item ) {return item.id;})
.subscribe(function ( groupObs ) {
groupObs.subscribe(function ( item ) {
observers[item.id](item);
});
});
collectionSubject.onNext([
{id : 1, value : "first item / group 1"},
{id : 1, value : "second item / group 1"},
{id : 2, value : "first item / group 2"},
{id : 2, value : "second item / group 2"},
{id : 1, value : "third item / group 1"},
{id : 2, value : "third item / group 2"},
]);
测试结果在这里:
"tap emits first item / group 1"
"observer for group 1 emits first item / group 1"
"tap emits second item / group 1"
"observer for group 1 emits second item / group 1"
"tap emits first item / group 2"
"observer for group 2 emits first item / group 2"
"tap emits second item / group 2"
"observer for group 2 emits second item / group 2"
"tap emits third item / group 1"
"observer for group 1 emits third item / group 1"
"tap emits third item / group 2"
"observer for group 2 emits third item / group 2"
jsbin 在这里。
https://jsbin.com/qikamamohi/edit?js,console
注意:
-
concatMap 是一种逐项按顺序发出数组内容的技巧