2013-07-10 2 views
1

$ 각도를 사용하여 Angular 컨트롤러 레이어로 돌아갈 약속을 만드는 Angular 서비스가 있습니다. 해당 서비스 내에서 비동기 $ http.get 데이터 요청을 만듭니다.AngularJS Promise - 데이터가 아직로드되지 않은 상태에서 페이지를 탐색하는 동안 오류가 발생했습니다.

사용자가 인트라넷의 다른 영역으로 변경하면 새 페이지가 다시로드됩니다. 해당 네비게이션 동작으로 인해 약속이 실패합니다 (데이터가 비동기로드 될 때까지 기다리지 않는 경우) Google 앱에 실패하면 약속 오류 메시지 대화 상자가 표시됩니다.

이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 이것은 알려진 문제입니까? 사용자가 페이지를 탐색 할 때 오류 메시지가 표시되는 것을 원하지 않습니다. 이것은 XMLHttpRequests가 페이지에서 벗어날 때 취소된다는 것을 의미하기 때문입니까?

컨트롤러 코드 :

$scope.showEmployees = function() { 
     employeeService.getEmployees().then(function(data) { 
      $scope.employees = data; 
     }, function(errorMessage) { 
      alertMessage(errorMessage); 
     }); 
    }; 

서비스 코드 :

 getEmployees: function() { 
      var deferred = $q.defer(); 
      $http.get("/api/employees").success(function(data) { 
       deferred.resolve(data); 
      }).error(function() { 
       deferred.reject("An error occurred while retrieving data."); 
      }); 
      return deferred.promise; 
     } 
+1

어쩌면 onbeforeunload 핸들러시 전역을 설정하고있는 경우 전역이 설정되어 있으면 오류 메시지가 표시되지 않습니까? 또는 .error()에 전달하는 함수는 사용하지 않는 매개 변수를 사용합니다. 실제 실패에서 탐색으로 인해 취소 된 요청을 구별하기 위해이를 볼 수 있습니다. –

답변

1

시도 이벤트 같은 onbeforeunload 사용하기 :

var isUnload; 

function getEmployees() { 
    var deferred = $q.defer(); 
    $http.get("/api/employees").success(function(data) { 
     deferred.resolve(data); 
    }).error(function() { 
     if (!isUnload) { 
      deferred.reject("An error occurred while retrieving data."); 
     } 
    }); 
    return deferred.promise; 
} 

window.addEventListener("beforeunload", function() { 
    isUnload = true; 
}); 
+0

감사합니다 이것은 좋은 일이 될 것입니다. AngularJS 사이트에 누락 된 문서가있는 것 같습니다. $ browser.defer.cancel (deferedId)가있는 것처럼 보이지만 실제로 원하는 것은 $ browser.defer.cancelAll(); – BuddyJoe