结合forkJoin和map的RxJs V4运算符

时间:2017-07-04 07:34:37

标签: javascript operators rxjs reactive-programming

我正在尝试找到一个操作符,让我可以在一步而不是两步中处理forkJoinmap执行的操作。

我的输入是一个具有不同长度的可观察数组,我想等到所有这些都已完成,然后从我可以订阅的可观察输出中创建一个计算结果。

我还没有遇到过允许这些要求并将数组作为输入的问题。

下面是一个用例示例:

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]的输出; 我可以通过使用forkJoinmap并运行flatten函数来实现它,但我想知道是否有一个运算符允许我一次性执行此操作。

感谢。

3 个答案:

答案 0 :(得分:2)

您不必使用map,您只需将结果选择器函数作为forkJoin的最后一个参数传递,例如:

Rx.Observable.forkJoin([observable1, observable2], _.concat)

另请注意,示例中的observable1observable2未完成,导致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回答。