次の観測値の作成に問題があります。
あらかじめ定義された値の配列を受け取るようにしたい
そして、私は別のものでフィルタリングし、これらを個々の観測値として扱うことができます。私は私は私の質問に十分な特異的ではなかった申し訳ありません:その後、
そして、それはこれらのフィルター観測をマージする時間が来るとき、私は、元の1つの複数の観測可能な状態でのReactiveXフィルタリングとマージ
//Not sure the share is necessary, just thought it would tie it all together
const input$ = Observable.from([0,1,0,1]).share();
const ones$ = input$.filter(n => n == 1);
const zeroes$ = input$.filter(n => n == 0);
const zeroesChanged$ = zeroes$.mapTo(2);
const onesChanged$ = ones$.mapTo(3);
const allValues$ = Observable.merge(onesChanged$,zeroesChanged$);
allValues$.subscribe(n => console.log(n));
//Outputs 3,3,2,2
//Expected output 3,2,3,2
EDITからの順序を保持したいです。 私は、副作用をドライバに分けるcycleJSというライブラリを使用しています。 それでは、私は私のサイクルでやっていることは、私はそれのためにテストを書きたいと思ったときに今、私の問題が生じ、この
export function socketCycle({ SOCKETIO }) {
const serverConnect$ = SOCKETIO.get('connect').map(serverDidConnect);
const serverDisconnect$ = SOCKETIO.get('disconnect').map(serverDidDisconnect);
const serverFailedToConnect$ = SOCKETIO.get('connect_failed').map(serverFailedToConnect);
return { ACTION: Observable.merge(serverConnect$, serverDisconnect$, serverFailedToConnect$) };
}
です。私は間違った問題(冗談を使って)で働いた次のものを試しました
const inputConnect$ = Observable.from(['connect', 'disconnect', 'connect', 'disconnect']).share();
const expectedOutput$ = Observable.from([
serverDidConnect(),
serverDidDisconnect(),
serverDidConnect(),
serverDidDisconnect(),
]);
const socketIOMock = {
get: (evt) => {
if (evt === 'connect') {
return inputConnect$.filter(s => s === 'connect');
} else if (evt === 'disconnect') {
return inputConnect$.filter(s => s === 'disconnect');
}
return Observable.empty();
},
};
const { ACTION } = socketCycle({ SOCKETIO: socketIOMock });
Observable.zip(ACTION, expectedOutput$).subscribe(
([output, expectedOutput]) => { expect(output).toEqual(expectedOutput); },
(error) => { expect(true).toBe(false) },
() => { done(); },
);
私はそれをテストすることができる別の方法がありますか?
コードの下
'入力$ .map(n => n + 2)'です。期待している出力をもっと詳しく見てください。 – cartant
Observable上の "仕事"が一度に1つの値しか考慮しない場合、@cartantは示唆するように、これを "フィルタリング、作業、マージ"とみなすのではなく、まっすぐなマッピングとみなすべきです。最も一般的な場合、あなたのマッピング関数は、if-elseを使って値を別の振る舞いに導きます。彼らがObservables自身を返す場合は、[concatMap](https://www.learnrxjs.io/operators/transformation/concatmap.html)で注文を保存できます。 – concat
実際に私はマップを分離して(ソースと戻り値のシンクを取る)別の関数にマージします。入力が非同期に来るとうまくいきますが、テストしようとすると入力があらかじめ指定されています注文を保存します... – user1898027