2017-07-04 48 views
0

我试图找到一个运营商,让我来处理一步到位,而不是两个由forkJoinmap执行的操作。RxJs V4操作,结合forkJoin和地图

我的输入是可观察的阵列具有不同长度和我想等待,直到所有的人已经完成,然后创建从可观察输出,我可以订阅计算结果。

我还没有遇到一个允许这些要求,并采取数组作为输入。

下面的使用情况的一个例子:

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和运行扁平化功能的实现它,但我不知道是否有一个单一的运营商,可以让我这样做是一气呵成。

谢谢。

回答

2

您不必使用map,你可以传递一个结果选择功能的forkJoin最后的说法,如:

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

另外请注意,在你的榜样observable1observable2没有完成,这防止forkJoin发布结果。

+0

哦,太棒了!不知道forkJoin上的选择器功能!这样做的工作。谢谢 –

+0

我刚刚改变了从_.flatten到'_.concat'匹配选择器签名的例子。这里使用'lodash'函数。 –

0

forkJoin的最后一个参数是一个可以操纵可观察结果的函数。尝试这样的:

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,观察者必须完成。

+0

使用rxjs v4,接下来是我的下一个 –

0

通过您可以创建观测这样的方式(值发射时观察到的冷自动完成):

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为你解答。