私は与えられた数独(実装は重要ではない)に対する解を計算し、計算の各反復をRxJS Observableに公開するサービスを持っています。私は後でこの解決プロセスは私Angular2成分で人間による顕著な遅延とを通過する反復を表示するObservable.interval()
オブザーバーでこれに観察を組み合わせることObservable.zip()
を使用できるようにRxJS Observableからの排出量ごとに新しいオブジェクトを作成する方法は?
solve() : Observable<Field[][]> {
let observable = Observable.create((o: Observer<Field[][]>)=> {
let iterationCount : number = 0;
while (!this.sudokuGame.isFinished() && iterationCount < 500) {
iterationCount++;
this.eliminateOptions();
o.next(this.sudokuGame.boardFields);
}
if(this.sudokuGame.isFinished())
o.complete();
else
o.error("The game could not be finished after 500 iterations.");
});
return observable;
}
は、私がこれを行います。
私はそうのように私のAngular2成分で観察により放射されたデータを設定するときしかし、:
Observable.zip(this.sudokuSolverService.solve(),Observable.interval(500),(obs, timer) => {return obs}).subscribe((nextBoardFields: Field[][]) => {
this.sudokuGame.boardFields = nextBoardFields;
});
その後観察可能の排出が遅れているが、変更はそれにもかかわらず、即座に表示されます。これは私がnextBoardFields
-Arrayを参照してコピーしたことが原因だと思われますが、boardFields
--Arrayを私のsudoku-solvingサービスのAngular2-controllerのリンクとリンク解除する方法はわかりません。
これを行う可能性はありますか?
編集:どういうわけか、このことについては少し複雑だが、(おそらくImmutable.jsの助けを借りて)Field
クラスは不変にすることです私の心に来るだけの事。
私も変わらないと思っていますが、それは楽しいものではない複雑さのレイヤーを追加することに同意します。 – Maarek
実際にコード例を挙げてください。 – Soviut
あなたは正しいです、着信を編集してください。 – Maarek