Angularjs 中延迟承诺的错误处理

Error handling in Angularjs for deferred promise

我为 return 数据构建了一个工厂,该工厂通过延迟承诺使用 HTTP Get。当它是快乐的路径并且 url 是正确的时,它工作得很好。但是当出现错误时,我想捕获它。看来我是,但控制台中仍然显示 500 错误。有没有办法抓住这个?另外,我想对拒绝进行处理,但我不知道该怎么做。 TIA

angular.module("accQueries")
    .factory('leaseFactory', ['$http', '$q', function ($http, $q) {

            return {
                leases: '',
                makeRequest: function (url) {
                    // Create the deferred object
                    var deferred = $q.defer();

                    $http.get(url).then(function (resp) {
                        deferred.resolve(resp.data);
                    })
                    // potentially catch http error here??
                    .catch(function (err) {
                        deferred.reject(err);
                        console.log('rejected  : ' + err );
                        console.dir(err);
                        this.leases = '';
                    });

                    return deferred.promise;
                },
                // Return a single lease based on lease number
                getLease: function (pLeaseNum) {
                    this.leases = this.makeRequest("http://someserver/AccruentQA_DB/webresources/restfulservices.latbllease/leaseNumber/" + pLeaseNum);
                    // Return the lease object stored on the service
                    return this.leases;
                },
                // Return all leases based on lease name
                getLeases: function () {
                    this.leases = this.makeRequest("http://someserver/AccruentQA_DB/webresources/restfulservices.latbllease/name/");

                    // Return the lease object stored on the service
                    return this.leases;
                }
            };

        }]);

不需要在 $q 中包装 $http 调用,因为 $http returns 本身就是一个承诺。所以像这样返回 $http 就足够了:

makeRequest: function (url) {
   return $http.get(url);
}

如果你想在 makeRequest 函数中链接做某事并传递答案 be4,你可以像这样链接承诺:

makeRequest: function (url) {
   return $http.get(url).then(function(response){
      //do something
      return response; 
   }, function(error){
      //do something
      return error;
   });
}

无法阻止 HTTP 错误出现在控制台中。浏览器在将结果传回 angular 之前执行此操作。但是,错误会导致 $http 承诺被拒绝,这意味着您可以使用 then()

的可选第二个参数来处理它
return $http.get('url').then(
    function(response) { 
        this.leases = response.data;
    },
    function(response) {
        var statusCode = response.status;
        var response = response.data;
        // other error processing
        this.leases = '';
    }
}).then(function() { return this.leases; }

您可以根据状态代码和响应数据执行各种操作。如果您的服务器发出错误 500,那将是 response.status。超时状态为 0。

您还应注意,getLease() 将在 ajax 请求完成之前 return。您应该 return 承诺,然后在调用代码中,链接另一个 then() 以在承诺得到解决后执行某些操作。