source

AngularJS - $q 약속을 올바르게 해결하기 위해 $apply가 필요한 이유는 무엇입니까?

ittop 2023. 4. 2. 11:55
반응형

AngularJS - $q 약속을 올바르게 해결하기 위해 $apply가 필요한 이유는 무엇입니까?

글로벌 Javascript 객체에 지정된 설정 파라미터를 선택할 수 있는 작은 서비스를 각진 앱에 작성하려고 합니다.문서가 준비되지 않는 한 글로벌 구성 개체에 액세스하지 않습니다(HTML에 스크립트 요소가 삽입되는 순서를 보장할 수 없기 때문입니다).

그런데 왜 전화해야 하는지 모르겠어요.$apply결의가 실제로 에 전파되다then콜백

myModule.service('GlobalConfigService', ['$q', '$rootScope', function($q, $rootScope) {
    var def = $q.defer();
    $(document).ready(function() {
        def.resolve(MyConfig.val);
        $rootScope.$apply();
    });

    def.promise.then(function () {
        console.log('I am called only when $apply() is called. Why?');
    });

    return def.promise;
}]);

각진 상태resolve()의 결과는 즉시가 아니라 $digest 사이클 내에서 비동기적으로 전파됩니다.즉, then()에 등록된 콜백은 다이제스트사이클이 발생했을 때만 호출됩니다.

코드에서는 Angular가 다이제스트 사이클에 들어가는 원인이 되지 않기 때문에 then() 콜백은 호출되지 않습니다.$apply()를 호출하는 것은 다이제스트 사이클을 실행하는 한 가지 방법입니다.다른 방법: ng-click으로 아무것도 하지 않는 버튼을 추가한 후 해당 버튼을 클릭하면 다이제스트 사이클이 발생하고 결과가 표시됩니다.

<button ng-click="">Force digest by clicking me</button>

https://stackoverflow.com/a/14657974/215945 도 참조해 주세요.

언급URL : https://stackoverflow.com/questions/14746314/angularjs-why-is-apply-required-to-properly-resolve-a-q-promise

반응형