Javascript 安格拉斯拒绝了他的承诺

Javascript 安格拉斯拒绝了他的承诺,javascript,angularjs,Javascript,Angularjs,我在这里有一些奇怪的行为。。。。 我创建了一个服务来处理所有API调用。 看起来是这样的: angular.module('widget.data').service('apiHandler', apiHandler); apiHandler.$inject = ['$http', 'SimpleCache', 'apiUrl', 'ngNotify']; function apiHandler($http, simpleCache, apiUrl, ngNotify) { ret

我在这里有一些奇怪的行为。。。。 我创建了一个服务来处理所有API调用。 看起来是这样的:

angular.module('widget.data').service('apiHandler', apiHandler);

apiHandler.$inject = ['$http', 'SimpleCache', 'apiUrl', 'ngNotify'];

function apiHandler($http, simpleCache, apiUrl, ngNotify) {

    return {
        url: apiUrl,

        get: get,
        post: post,
        put: put,
        delete: requestDelete
    };

    //////////////////////////////////////////////////

    // GET
    function get(url, params) {
        return buildRequest(url, 'GET', null, params);
    };

    // POST
    function post(url, data) {
        return buildRequest(url, 'POST', data);
    };

    // PUT
    function put(url, data) {
        return buildRequest(url, 'PUT', data);
    };

    // DELETE
    function requestDelete(url, params) {
        return buildRequest(url, 'DELETE', null, params);
    };

    // Private function to build our request
    function buildRequest(url, method, data, params) {

        //console.log(url);

        // Create our apiPath
        var apiPath = url.indexOf('http') > -1 ? url : apiUrl + url;

        // Create the model
        var model = {
            method: method,
            url: apiPath,
            data: data,
            params: params,
            cache: simpleCache
        };

        // If we are performing an update/create or delete call
        if (method !== 'GET') {

            // Remove from our cache
            simpleCache.remove(apiUrl + url);
        }

        // Build our request
        return $http(model).then(function (response) {

            // Return our response
            return response.data;

            // If we have an error
        }, function (response) {

            console.log(response.data.exceptionMessage);

            // Display our error
            ngNotify.set(response.data.exceptionMessage, { type: 'error' });

            // Return our error
            return response;
        });
    };
};
您可以在buildMessage中看到它返回调用、响应和错误响应。所以我希望,如果出现错误,任何注入了错误的服务都会触发错误回调。 但事实并非如此。 我有以下服务:

angular.module('widget.directives').service('pkAuthenticateService', pkAuthenticateService);

pkAuthenticateService.$inject = ['apiHandler'];

function pkAuthenticateService(apiHandler) {
    return {
        register: register
    };

    //////////////////////////////////////////////////

    function register(model) {

        return apiHandler.post('users/create', model).then(function (response) {
            console.log('success', response);
            return response;
        }, function (response) {
            console.log('error', response);
            return response;
        });
    };
};
但是我在控制台中得到的消息是成功消息,而不是错误。
有人能给我解释一下原因吗?或者帮助我使其按预期工作(即,如果它在父服务中失败,那么它应该一直失败)。

catch函数返回已解决的承诺,而不是已拒绝的承诺:

    return $http(model).then(function (response) {
       ...
    }, function (response) {
       ...
        // Return our error
        return $q.reject(response);
    });
如果onRejected引发错误或错误,则catch()返回的承诺将被拒绝 返回本身被拒绝的承诺;否则,问题就解决了

为了使被拒绝的承诺渗透到外部函数(或如您所说的“一路失败”),您需要将其作为被拒绝的承诺返回:

    return $http(model).then(function (response) {
       ...
    }, function (response) {
       ...
        // Return our error
        return $q.reject(response);
    });

为管理承诺注入angular的$q服务。 然后从$q创建延迟并执行您的请求。在您请求的结果中,解决或拒绝提供数据的承诺。然后返回延迟对象。 因此,以这种方式更改服务应该是可行的:

angular.module('widget.data').service('apiHandler', apiHandler);

apiHandler.$inject = ['$http', 'SimpleCache', 'apiUrl', 'ngNotify', '$q'];

function apiHandler($http, simpleCache, apiUrl, ngNotify, $q) {

    return {
        url: apiUrl,

        get: get,
        post: post,
        put: put,
        delete: requestDelete
    };

    //////////////////////////////////////////////////

    // GET
    function get(url, params) {
        return buildRequest(url, 'GET', null, params);
    };

    // POST
    function post(url, data) {
        return buildRequest(url, 'POST', data);
    };

    // PUT
    function put(url, data) {
        return buildRequest(url, 'PUT', data);
    };

    // DELETE
    function requestDelete(url, params) {
        return buildRequest(url, 'DELETE', null, params);
    };

    // Private function to build our request
    function buildRequest(url, method, data, params) {

        //console.log(url);

        // Create our apiPath
        var apiPath = url.indexOf('http') > -1 ? url : apiUrl + url;

        // Create the model
        var model = {
            method: method,
            url: apiPath,
            data: data,
            params: params,
            cache: simpleCache
        };

        // If we are performing an update/create or delete call
        if (method !== 'GET') {

            // Remove from our cache
            simpleCache.remove(apiUrl + url);
        }

        var deferred = $q.defer();
        $http(model).then(function (response) {

            // Return our response
            $q.resolve(response.data);

            // If we have an error
        }, function (response) {

            console.log(response.data.exceptionMessage);

            // Display our error
            ngNotify.set(response.data.exceptionMessage, { type: 'error' });

            // Return our error
            $q.reject(response);
        });
        return deferred;
    };
};

这是JS承诺中最有趣、最令人困惑的案例之一——“吞咽”错误。考虑以下情况:

var x=新承诺((结果,拒绝)=>{
拒绝(‘坏东西’)
})
x、 然后(()=>{
console.log('wow')
返回“a”;
},()=>{
console.log('ops'))
返回“a”;
}).然后(()=>{
console.log('I'mbaack')
返回“a”;
},()=>{
console.log('仍然坏吗?')
返回“a”;
})