2013-07-10 24 views
1

我有一個Angular服務,它使用$ q創建一個承諾,返回到Angular控制器層。在該服務內部,它會對數據進行異步$ http.get請求。AngularJS承諾 - 如果數據仍在加載導航離開頁面時出錯

當用戶更改爲我們的Intranet的另一個區域時,他們正在重新加載一個新頁面。該導航操作導致承諾失敗(如果您不等待數據異步加載) 在我們的應用程序中失敗的承諾顯示自定義錯誤消息對話框。

處理這個問題的最佳方法是什麼?這是一個已知的問題?我們不希望用戶在瀏覽頁面時看到錯誤消息。這是因爲在瀏覽頁面時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