我有一個服務,計算一個給定的Sudoku(實現不重要)的解決方案,併發布每個RxJS Observable計算迭代。如何爲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;
}
我這樣做,這樣我可以在以後使用Observable.zip()
這個觀察到的結合與Observable.interval()
觀測顯示這個解決過程經歷與我的Angular2組分人類明顯的延遲迭代。
但是,當我設置由可觀察在我Angular2組分像這樣發出的數據:
Observable.zip(this.sudokuSolverService.solve(),Observable.interval(500),(obs, timer) => {return obs}).subscribe((nextBoardFields: Field[][]) => {
this.sudokuGame.boardFields = nextBoardFields;
});
然後可觀察到的排放被延遲,但更改顯示瞬間不過。我懷疑這是由於我通過引用複製了nextBoardFields
引起的,但是我不知道任何方法可以將我的Angular2控制器中的boardFields
-Array與boardFields
- 中的數組取消關聯,這是我的sudoku解決服務中的一個方法。
有沒有可能做到這一點?
編輯:那我腦海是以某種方式使Field
類不可變的(也許Immutable.js的幫助下),這似乎對這個問題有點複雜的唯一的事情。
我確實知道不可變也會起作用,但我同意它增加了一層複雜性,這不會很有趣。 – Maarek
你應該給出一個代碼示例。 – Soviut
你是對的,編輯傳入。 – Maarek