2014-07-09 16 views
5

무한 다이제스트 루프의 기본 개념과 그 일이 어떻게 발생하는지,하지만 문제가 있습니다.

http://jsfiddle.net/eS5e5/1/

jsfiddle 콘솔에서 당신이 무한 소화 루프를 볼 수 있습니다 : 여기 내 코드와 문제를 보여주는 바이올린입니다.

기본적으로 아직로드하지 않은 데이터에 대한 결정을 내려야하므로 then()을 사용하여 해결할 때까지 기다려야합니다. 나는 user라고하는 약속을했습니다. 코드에서 두 개의 다른 위치가 있는데, 여기서 나는()을 호출합니다.

  1. 그냥 정의합니다. 나는 그것을 기반으로 범위 변수를 설정해야합니다. 난 그냥 $ scope.isAdmin() 메소드에 직접 $ scope.user를 사용하지 않는 이유 번호 2에 대한 또 다른 범위의 방법에서
  2. , $ scope.isAdmin()는

, 그것은하라는 메시지가 표시 될 수 있습니다. 문제는 $ scope.isAdmin()이 사용자가 비동기 요청을하기 전에 호출 될 수 있다는 것입니다.이 경우 $ scope.isAdmin()에서 반환하기 전에 '차단'해야합니다.

제 질문은 $ scope.isAdmin()이 '감시 된'변수가 변경되었고 다이제스트주기를 다시 실행해야한다고 생각합니까?

$ scope.isAdmin()이 실제로 아무것도 변경하지 않습니다.

HTML :

<body ng-controller='myController'> 
    <div ng-if='isAdmin()'>Hi! <strong>{{ user.username }}</strong> is an Admin!!!</div> 
    <div ng-if='!isAdmin()'>Hi! <strong>{{ user.username }}</strong> is NOT an Admin!!!</div> 
</body> 

그리고 JS : 그래서

angular.module('myApp', []) 
    .factory('myService', function($q, $timeout) { 
    return {   
     getUser: function() { 
     var deferred = $q.defer(); 

     $timeout(function() { 
      deferred.resolve({ username: 'me', isAdmin: true }); 
     }, 2000); 

     return deferred.promise; 
     } 
    }; 
    }) 
    .controller('myController', function($scope, $q, myService) {  
    var getUserDeferred = $q.defer(); 
    var user = getUserDeferred.promise; 
    user.then(function(user) { 
     $scope.user = user; 
     return user; 
    }); 

    $scope.getUser = function() { 
     return myService.getUser().then(function(user) { 
     getUserDeferred.resolve(user); 
     }); 
    }; 

    $scope.isAdmin = function() { 
     return user.then(function(user) { 
     return user.isAdmin; 
     }); 
    }; 

    $scope.getUser(); 
    }); 

답변

13

나는 마침내 내 자신의 문제를 파악하고 내가 그것을 대답 것이라고 생각 여기

는 벗었 코드 누군가 다른 사람이이 정보를 유용 할 수 있습니다.

수정 사항의 핵심은 각도 약속 각 시계입니다. 2 가지 개념을 인식하고 적용함으로써 실제로 수정 작업은 매우 간단했습니다.

$ scope에 넣은 모든 것은 기능을 포함하여 '감시'됩니다. 변경 사항을 적용 할 때마다 $ apply()가 다시 실행되어 변경 사항을 적용합니다. 범위 함수 (예 : $ scope.isAdmin())가 반환 값을 '적용'에서 다음 값으로 변경하면 상황이 안정되고 반환 값이 변경되지 않을 때까지 다른 '적용'을 트리거합니다.

내 코드에서 반환 값이 변경된 이후 영원히 계속 적용주기를 유지하는 새로운 약속을 반환하는 user.then (...)을 반환했습니다.

isAdmin() 함수에서 사용자가 실제로로드 할 때까지 반환 값을 지연해야했습니다 (다른 반환 값은 의미가 없습니다). 따라서 사용자 비동기 호출이 $ scope.user를 검사하여 해결되었는지 확인하고 유효한 isAdmin 값을 반환하는지 확인하도록 코드를 변경했습니다. $ scope.user가 여전히 정의되지 않았다면 나는 이미 만든 약속을 반환 할 것입니다.

$ 범위가 변경되었습니다.isAdmin()은 다음과 같아야합니다.

이것은 무한한 적용주기를 트리거하지 않고 원래 코드와 동일한 효과가 있습니다. 특히 $ scope.user가 해결되지 않은 경우 사용자 var를 반환하여 이전처럼 약속을 반환합니다. 그러나 사용자 var는 then()에 의해 생성 된 새 약속과 동일한 약속이므로 적용주기가 안정됩니다. '하지만 내 코드 I에서 : 내 문제를 이해하게하는이 나를 위해 정말 관련 비트를했다 - 자신의 질문에 대답하기위한

http://jsfiddle.net/eS5e5/2/

+1

감사 :

그리고 여기 완전성에 대한

업데이트 된 jsfiddle입니다 새로운 값을 반환하는 [...] 값이었습니다 (반환 값이 변하지 않았기 때문에 적용주기가 영원히 계속되었습니다).' – keithl8041

관련 문제