1
我跟隨Tero Parviainen的書「構建您自己的angularJS」,並且在討論$ evalAsync時引入的概念之一時遇到麻煩。
在其中一個例子,他聲明瞭一個守望者,它總是調用$ evalAsync:
眼看例如,我預計消化週期通過觀察重複兩次,直到停止。在範圍的實現中,代碼運行直到摘要不髒或隊列中不再有$ evalAsyncs。
Scope.prototype.$digest = function() {
var ttl = 10;
var dirty;
this.$$lastDirtyWatch = null;
do {
while (this.$$asyncQueue.length) {
var asyncTask = this.$$asyncQueue.shift();
asyncTask.scope.$eval(asyncTask.expression);
}
dirty = this.$$digestOnce();
if ((dirty || this.$$asyncQueue.length) && !(ttl--)) {
throw '10 digest iterations reached';
}
} while (dirty || this.$$asyncQueue.length);
};
如果對於循環中的每次迭代,如果從數組中移出一個asyncTask,那麼該循環是如何運行的?不應該因爲$$ asyncQueue被清空而停止循環?
希望我明確表示,謝謝大家!
嘿馬克西姆!感謝您的回答。據我所知,只有一個摘要循環被觸發,但正如你所說,當調用$ evalAsync時,你添加一個新的項目asyncQueue。我沒有得到的是爲什麼這個過程重複一遍又一遍。我在摘要函數的開始處使用console.log,它只調用一次。爲什麼執行 ''' 函數(範圍){} ''' $ eval不斷向$$ asyncQueue添加一個項目? 再次感謝和抱歉在理解 – Riboher
@Riboher'我沒有得到的是爲什麼這個過程一遍又一遍地重複。'這就是我所說的'scope。$ evalAsync'將新項目添加到'asyncQueue'和調用新的觀察迭代器。新的迭代器再次調用'scope。$ evalAsync',所以這個循環是無限的 –