2016-12-20 9 views
1

RxJS:どのようにあなたが観察可能に、このような文字列としてプリミティブ型をラップし、そのプリミティブへの変更に耳を傾けていますか?RxJS:文字列を折り返して文字列を変更する方法は?

次の例を考えます。 setTimeoutは、文字列sを変更する外部イベントをシミュレートします。ただし、console.logは1回だけ発生し、setTimeoutが呼び出された後には発生しません。何故ですか?

let s = "Hello World"; 
Observable.of(s).subscribe(val => { 
    console.log(val); 
}); 
// some external event changes variable s 
setTimeout(() => { 
    s = "Wat?"; 
}, 1000); 
// Output: prints "Hello World" to console, but not "Wat?" 

この質問は少し間抜けに聞こえるかもしれませんが、私はRxJSのドキュメントと例のすべての種類によって2時間で検索し、それらのほとんどは、配列またはオブジェクトで遊びます。これは私が望むものではありません。私は属性、関数、配列などを変更したくありません。単なる文字列またはブール値または数値。

+3

しかし、文字列は不変です。 – Pointy

+0

有効なポイント。だからRxJSはそれを考慮しないのですか? – ntaso

+1

サンプルコードでは、プリミティブな文字列* value * '" Hello World "'があり、*変数* 's'があります。あなたは、あなたが観察しているものであり、それほど多くの文字列の値(文字列の値が変更されないので良い)を変数に持たせたいと思うようです。 – Pointy

答えて

2

ストリームについて間違って考えています。ストリームの全体的なポイントはではなく、はオブジェクトを直接変更する必要があるということです(文字列は実際には@Pointyで説明されているように突然変異させることはできませんが、もっと一般的な点です)。

あなたはデータを不変であると見なすように、そしてストリームをあなたの反応が変化するように見せかける必要があります。

例では、文字列を「変更する」場合、実際に何をしようとしているのかは、一連の変更をキャプチャして、subscribeメソッドのハンドラnextによってサーフェスします。それらの変更が文字列の視点からは無関係である場合、イベントがそれを通過しているかどうかだけを気にします。

つまり、私は別の文字列を発するように、次のことができます:あなたが判断するために必要なもの

Rx.Observable.timer(1000) 
    .mapTo('Wat') 
    .startWith('Hello World!') 
    .subscribe(x => console.log(x)); 

は、変更のソースが何であるか、それが発するべき事象です。そこから、Rxはそのデータを下流で使用できるものにマッサージするのに役立ちます。

+0

説明をありがとう。 RxJSは廃止予定のバニラJS Object.observe()メソッドとは何の関係もなく、ノックアウトやAngular 2のオブザーバブルとは何も関係ありません。私はこれらのより伝統的なオブザーバーの代わりとしてRxJSを考えたと思います。結局のところ、RxJSはObservables *のLodash *と呼ばれていましたが、明らかにウェブサイトから削除しました。 – ntaso

1

私はこの質問には受け入れられた答えがあることを認識していますが、ここではRxJSを使った変更を文字列で観察する適切な方法があります。

タイプReplaySubject

stringVariable$: ReplaySubject<String> = new ReplaySubject<String>(); 

のための変数を作成し、更新イベントをキャッチする機能を経由してstringVariableにすべて新しい値を割り当てます。

assignNewValue(newValue: String) { 
    this.stringVariable$.next(newValue); 
} 

あなたの文字列変数で始まるするための初期値を持っている場合は別の方法としてはBehaviourSubjectを使用することができ、この観察可能

stringVariable$.subscribe((newValue: String) => { 
    console.log(newValue); 
}); 

を購読します。

関連する問題