2017-09-10 17 views
1

Tero Parviainen의 저서 "Build your own angularJS"를 따르고 있으며 $ evalAsync에 대해 이야기 할 때 소개 한 개념 중 하나를 이해하는 데 어려움을 겪고 있습니다.

이 예제 중 하나에서 그는 항상 $ evalAsync를 호출하는 감시자 선언

it('eventually halts $evalAsyncs added by watches', function() { 
  scope.aValue = [1, 2, 3]; 
  scope.$watch(
    function(scope) { 
      scope.$evalAsync(function(scope) { }); 
      return scope.aValue; 
    }, 
    function(newValue, oldValue, scope) { } 
  ); 
  expect(function() { scope.$digest(); }).toThrow(); 
}); 

그 예를보고을, 나는 다이제스트주기가 중지 될 때까지 전문가를 통해 두 번 반복하는 기대. 범위의 구현에서 코드는 다이제스트가 더티가 아니거나 대기열에 더 이상 $ evalAsync가 없을 때까지 실행됩니다.

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가 비워지기 때문에 루프가 멈추지 않아야합니까?

희망 나는 분명히하고 모두에게 감사를 표했다! 당신이 asyncQueue에 새 항목을 추가

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

:

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

그래서 this.$$asyncQueue.shift();에 의해 작업을 제거 우리는 새로운 반복 A.E. 전화 호출하여

답변

0

새로운 다이제스트주기.

은 어쨌든 감시자의 적절한 구현은 다음과 같습니다

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'를 다시 호출하므로이 루프는 무한합니다. –