2017-12-05 6 views
1

私はforkJoinしたい2つの観測があります。これらの観測のrxjs:forkJoinは完了するために少なくとも1つの呼び出しを必要としますか?

var goodObservable = Rx.Observable.create(function(observer){ 
    observer.next('something'); 
    observer.complete(); 
    }); 

    var badObservable = Rx.Observable.create(function(observer){ 
    observer.complete(); 
    }); 


    var forkJoinedObservable = Rx.Observable.forkJoin([goodObservable, badObservable]); 

    forkJoinedObservable.subscribe(function(results){ 
    console.log(results); 
    }); 

一つは、唯一の完全な呼び出します。今私は、forkJoined observablesが決して起動されないことを発見しました。 forkJoinのサブスクリプションを実行させるには、badObservableのobserver.next()をコールする必要があります。 [「何か」]

が、これはバグですか、私が正しく概念を理解していなかった。

私の予想される動作はforkJoin-購読はただ一つのアイテムを含む配列で実行されるだろうということでしょうか?

私はこのためplunkrを行った:https://plnkr.co/edit/QaA9DwyWAmTGbthvguPK?p=preview

+0

forkJoin()は各観測値から* last *放出アイテムを放出します。この場合、放出するアイテムはありません。 –

+0

しかし、observer.complete()を呼び出すと、他のオブザーバが値を生成したので、forkJoinがトリガされるべきではありませんか? –

+2

いいえ、forkJoinが動作するためには、すべてを発行して完了する必要があります。フォーク結合インタフェースは、引数と一致する配列を返すようなものなので、引数よりも短い配列を返すことはできません。各アイテムが発行されない場合は、そこにあるべきもの(null?undefined?)を前提にする必要があります。あなたは、forkjoinの代わりにconcatを使用した後のように見えるように、物事を簡単に再構成することができます。 – bryan60

答えて

3

forkJoin()各観察から放出された最後のアイテムを発します。この場合、放出する項目はないので、演算子は放出しません。

現実的な解決策は、それぞれの観察可能な部分に.startsWith(defaultValue)を呼び出すことです。forkJoin()も同様に完了できます。

var goodObservable = Rx.Observable.create(function(observer){ 
    observer.next('something'); 
    observer.complete(); 
}); 

var badObservable = Rx.Observable.create(function(observer){ 
    observer.complete(); 
}).startWith(null); 


var forkJoinedObservable = Rx.Observable.forkJoin([goodObservable, badObservable]); 

forkJoinedObservable.subscribe(function(results){ 
    console.log(results); 
}); 

放出した観測値だけの値を放出することについては、どの観測値が放出されたのかわからないため、これは機能しません。もちろん、それはnullを放出した可能性があります。しかし、これは演算子を組み合わせることで実現可能ですが、変化するとは思いません。

関連する問題