我有一个服务,可以计算给定数独的解(实现方式不重要),并在 RxJS 可观察对象中发布每个计算迭代。
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 与 Observable.interval() 观察者组合,以带有可被人类感知的延迟显示此解决过程所经历的迭代,在我的 Angular2 组件中。
然而,当我在 Angular2 组件中设置由 Observable 发出的数据时,代码如下:
Observable.zip(this.sudokuSolverService.solve(),Observable.interval(500),(obs, timer) => {return obs}).subscribe((nextBoardFields: Field[][]) => {
this.sudokuGame.boardFields = nextBoardFields;
});
然后,Observable 的排放被延迟,但变化仍然立即显示。我怀疑这是因为我通过引用复制了 nextBoardFields 数组,但我不知道如何从我的 Angular2 控制器中与我的数独求解服务中的 boardFields 数组取消链接。有没有可能做到这一点?编辑:我想到的唯一方法是以某种方式使 Field 类成为不可变的(也许借助 Immutable.js),但这似乎对此问题有点复杂。