【问题标题】:AngularJS Promise - error while navigating away from page if data still loadingAngularJS Promise - 如果数据仍在加载,则在离开页面时出错
【发布时间】:2013-07-08 17:28:27
【问题描述】:

我有一个 Angular 服务,它使用 $q 创建返回到 Angular 控制器层的承诺。在该服务内部,它对数据发出异步 $http.get 请求。

当用户切换到我们 Intranet 的另一个区域时,他们正在重新加载一个新页面。该导航操作导致承诺失败(如果您不等待数据异步加载) 在我们的应用程序中,promise 失败会显示一个自定义错误消息对话框。

处理此问题的最佳方法是什么?这是一个已知的问题?我们不希望用户在离开页面时看到错误消息。这是因为在离开页面时 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;
        }

【问题讨论】:

  • 可能在 onbeforeunload 处理程序期间设置了一个全局,如果设置了全局,您不会显示错误消息?或者,您传递给 .error() 的函数采用您未使用的参数。您可以查看这个来区分由于导航而取消的请求和真正的失败。

标签: javascript angularjs promise angular-services


【解决方案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;
});

【讨论】:

  • 谢谢,这可能是一个很好的解决方法。看起来 AngularJS 网站上可能缺少一些文档。看起来有一个 $browser.defer.cancel(deferedId) 但我真正想要的是 $browser.defer.cancelAll();
  • @BuddyJoe 确实使用了 $browser.defer.cancel(deferedId) 或 $browser.defer.cancelAll();为你工作?我遇到了类似的问题,想解决。
猜你喜欢
  • 1970-01-01
  • 2012-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多