如何在$ q deferred promises

时间:2016-11-18 14:18:22

标签: javascript angularjs angularjs-scope angular-digest angular-decorator

我计划根据错误代码创建自定义提醒消息。 因此,我必须在将请求发送到服务器并从服务器获取响应时获取错误代码。

500 - 出了点问题。 403-发生技术错误; 401 - 找不到文件。 400-未经授权的访问:

在应用程序中,我可以在httpinterceptor响应中捕获错误代码 但是我无法在延期承诺中捕获错误代码。

var app = angular.module('myApp', []);

app.run();

控制器:

var app = angular.module('myApp', []);

app.run();

app.controller('myController', ['$scope', 'myService', function ($scope, myService) {
    var myCtrl = this;
    myCtrl.EmployeeList = [];
    myService.getData().then(function (data,status) {
        myCtrl.EmployeeList = data;
        console.log(status);
    }), (function (data, status) {
        if (status === 500) {
            toastr.warn("technical error occurred");
        }
        else if (status === 400) {

            toastr.warn("something went wrong");
        }
    });
}]);

var app = angular.module('myApp');

app.factory('myService', ['$http', '$q', function ($http, $q) {
    var fact = {};
fact.getData = function () {
    var deferred = $q.defer();
    //$http.get('/Test/getData',


    $http.get('http://simpleApiEarl.azurewebsites.net/api/envelopes',
        {
            cache: true
        })
        .then(function (response) {
            if (typeof response.data === 'object')
            {
                deferred.resolve(response.data);
            }
            else
            {
                debugger;
                deferred.reject(response.data);

                console.log("Error:" +response.status);
            }
        }, function (response, status) {

            console.log(response.status);
            deferred.reject(response.data,status);
        });
    return deferred.promise;
}

return fact;
}]);

使用interceptor

var interceptor = function ($q, $rootScope) {

        return {
            request: function (config) {
                console.log(config);
                return config;
            },

            response: function (response) {
                var deferred = $q.defer();

                return response || $q.when(response);
           },
            responseError: function (rejection) {
                if (rejection.status == 500)
                {

                    alert('Bad Request Processed');

                    return $q.reject(rejection);


                }


if(rejection.status == 403)

{
  alert('some thing went wrong');
}
            }
        }
    };

 $httpProvider.interceptors.push(interceptor);

问题: 为什么我无法在延期承诺的拒绝响应中捕获错误代码?

截图:

在发送服务电话之前:

enter image description here

拒绝后获取状态为0 enter image description here

在控制台中。 enter image description here

1 个答案:

答案 0 :(得分:0)

deferred.reject(response.data, status)之前,请尝试console.log(response)。在您的代码中查看它,您应该找到您的错误代码。

如果可以,请发布控制台日志的图片。

从我在您的代码中看到的内容,用以下内容替换您的条件:

if(data.status == 500) toastr.warn("technical error occurred");
else if(data.status == 400) toastr.warn("something went wrong");

在您的服务中,请停止发回response.data

deferred.reject(response,status);