2017-09-10 46 views
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被清空而停止循環?

希望我明確表示,謝謝大家!

回答

0

通過調用:

scope.$evalAsync(function(scope) { }); 

添加新項asyncQueue

asyncQueue.push({scope: this, expression: expr, locals: locals}); 

因此,通過this.$$asyncQueue.shift();刪除任務我們所說的新的迭代酸當量新的消化週期。

不管怎麼說守望的正確實施是:

scope.aValue = [1, 2, 3]; 
    scope.$watch(
    function(scope) { 
     return scope.aValue; 
    }, 
    function(newValue, oldValue, scope) { } 
); 
+0

嘿馬克西姆!感謝您的回答。據我所知,只有一個摘要循環被觸發,但正如你所說,當調用$ evalAsync時,你添加一個新的項目asyncQueue。我沒有得到的是爲什麼這個過程重複一遍又一遍。我在摘要函數的開始處使用console.log,它只調用一次。爲什麼執行 ''' 函數(範圍){} ''' $ eval不斷向$$ asyncQueue添加一個項目? 再次感謝和抱歉在理解 – Riboher

+0

@Riboher'我沒有得到的是爲什麼這個過程一遍又一遍地重複。'這就是我所說的'scope。$ evalAsync'將新項目添加到'asyncQueue'和調用新的觀察迭代器。新的迭代器再次調用'scope。$ evalAsync',所以這個循環是無限的 –