4

JSBIN サンプル

それぞれ独自の状態ストリームを持つ変更可能な子コンポーネント (POJO オブジェクト) のセットがあります。ユーザーが addChild/removeChild/clearChildren をトリガーするたびに、子状態ストリームの新しいセットが #switchMap で発行されます。ここまでは順調ですね!(そして、RxJS にはとても驚かされました!)

が空の配列でないRx.Observable.from(arrayOfStateStreams).combineAll()限り、良い結果が得られます。arrayOfStateStreams

これはより高いレベルで結合された (最新の) 部分的な状態であるため、空の配列を出力する必要があります。そうしないと、グローバル状態ツリーに、もはや真実ではない古い状態データが含まれます!

のような予約済みトークンを発行できますが['EMPTY-ARRAY-PLACEHOLDER-TOKEN']、それは奇妙です。より良い方法は、最後のインデックスがゴミと見なされるように、常に最後のストリームを配列に追加することです。ただし、コードと状態はまだ混乱しています。の子状態を持つ可能性があるため、使用[null]は OK ではありません'null'

これをうまく解決できる人はいますか?#combineAll の後に空の配列の他の表現がないはずなので、これはサポートできませんか?

4

4 に答える 4

2

これは とは関係ありませんcombineAll。問題はObservable.from、空の配列が渡されたときに何も返されない (空のオブザーバブル) ことです。

空の配列から結果を取得する必要がある場合に考えられる唯一の実行可能な解決策は、その場合に別のものを返すことです。

問題と考えられる解決策を説明する例。

var data = [1, 2, 3, 4, 5];

log('With data: ');
Rx.Observable.from(data)
    .subscribe(function (d) { log('data: ' + d); });

// Prints: 
// With data: 
// data: 1
// data: 2
// data: 3
// data: 4
// data: 5

var data = [];

log('Without data: ');
var nullDataObject = { msg: 'my null data object' };
Rx.Observable.from(data.length == 0 ? [nullDataObject] : data)
    .subscribe(function (d) { log('data: ' + d); });

// Prints: 
// With data: 
// data: [object Object]

jsfiddleで実行可能な例。

これを使用するときは、必要に応じて空の配列を表すオブジェクトをフィルターで除外するだけです。

于 2016-08-31T07:33:08.597 に答える