2013-07-10 51 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