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. 전화 호출하여
안녕 맥심! 귀하의 답변에 감사드립니다. 이해할 수 있듯이 하나의 다이제스트 사이클 만 트리거되지만 $ evalAsync를 호출 할 때 asyncQueue에 새 항목을 추가한다고합니다. 내가 왜 얻지 못하는지는이 과정이 반복해서 반복되는 이유입니다. 나는 다이제스트 기능의 시작 부분에 console.log를 한 번만 호출합니다. 왜 실행합니까? ''' 함수 (범위) {} '''$ eval을 가진 은 $$ asyncQueue에 하나의 항목을 계속 추가하나요? 다시 한 번 이해해 주셔서 감사합니다. – Riboher
@Riboher'이 프로세스가 반복되는 이유는 무엇입니까? '이것은 내가 말한 것입니다.'scope. $ evalAsync'는 'asyncQueue'에 새 항목을 추가하고 새로운 시계 반복기를 호출합니다. 새로운 반복자가'scope. $ evalAsync'를 다시 호출하므로이 루프는 무한합니다. –