我正在尝试找到一个操作符,让我可以在一步而不是两步中处理forkJoin
和map
执行的操作。
我的输入是一个具有不同长度的可观察数组,我想等到所有这些都已完成,然后从我可以订阅的可观察输出中创建一个计算结果。
我还没有遇到过允许这些要求并将数组作为输入的问题。
下面是一个用例示例:
const observable1 = Rx.Observable.create(
(observer) => {
observer.onNext([1, 2, 3, 4]);
observer.complete();
}
);
const observable2 = Rx.Observable.create(
(observer) => {
observer.onNext([5, 6, 7, 8]);
observer.complete();
}
);
Rx.Observable.magigOperator([observable1, observable2])
.subscribe(
(result) => console.log
);
现在我想要获得的结果是[1,2,3,4,5,6,7,8]
的输出;
我可以通过使用forkJoin
和map
并运行flatten函数来实现它,但我想知道是否有一个运算符允许我一次性执行此操作。
感谢。
答案 0 :(得分:2)
您不必使用map
,您只需将结果选择器函数作为forkJoin
的最后一个参数传递,例如:
Rx.Observable.forkJoin([observable1, observable2], _.concat)
另请注意,示例中的observable1
和observable2
未完成,导致forkJoin
无法发布结果。
答案 1 :(得分:0)
forkJoin的最后一个参数是一个可以操纵observables结果的函数。尝试这样的事情:
const observable1 = Rx.Observable.create(
(observer) => {
observer.next([1, 2, 3, 4]);
observer.complete();
}
);
const observable2 = Rx.Observable.create(
(observer) => {
observer.next([5, 6, 7, 8]);
observer.complete();
}
);
Rx.Observable.forkJoin([observable1, observable2], (res1, res2) => [...res1, ...res2]).subscribe((res) => {
console.log(res);
});
注意观察者下一个没有onNext方法。此外,如果你想forkJoin,观察者必须完成。
答案 2 :(得分:0)
顺便说一句,你可以像这样创建你的observable(冷值可观察值会在发出值时自动完成):
const observable1 = Rx.Observable.of([1,2,3,4]);
const observable2 = Rx.Observable.of([5,6,7,8]);
Observable.forkJoin(observable1, observable2, (...args)=> [].concat(...args));
感谢您kit回答。