Angularjs中的延迟承诺错误处理

时间:2016-03-17 15:49:03

标签: angularjs angular-promise

我构建了一个工厂来返回使用HTTP的数据获取延迟的承诺。当它是快乐的路径并且网址是正确的时,它工作得很好。但是当出现错误时我想抓住它。似乎我只是在控制台中仍然显示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;
                }
            };

        }]);

2 个答案:

答案 0 :(得分:2)

不需要在$ q中包装$ http调用,因为$ http会返回一个promise本身。所以只需返回$ 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;
   });
}

答案 1 :(得分:1)

无法阻止HTTP错误出现在控制台中。浏览器在将结果传递回角度之前执行此操作。但是,错误会导致$http承诺被拒绝,这意味着您可以使用then()的可选第二个参数来处理它{/ p>

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.

您还应该知道{j}请求完成之前getLease()将返回。您应该返回promise,然后在调用代码中链接另一个then(),以便在解析promise后执行某些操作。

相关问题