Angularjs 使用$q的reject and catch时可能存在未处理的拒绝

Angularjs 使用$q的reject and catch时可能存在未处理的拒绝,angularjs,ecmascript-6,Angularjs,Ecmascript 6,我有这样的JSON-RPC提供程序(通过babel和webpack传输): 我称之为一个函数: service.login('user', 'password').then(function(token) { if (token) { localStorage.setItem('notes_token', token); localStorage.setItem('notes_username

我有这样的JSON-RPC提供程序(通过babel和webpack传输):

我称之为一个函数:

        service.login('user', 'password').then(function(token) {
            if (token) {
                localStorage.setItem('notes_token', token);
                localStorage.setItem('notes_username', 'user');
            }
            console.log('token: ' + token);
        }).catch(function(error) {
            console.log(error);
        });
请求返回错误,我在控制台中得到:

令牌:未定义 [err]可能未处理的拒绝:用户未处于活动状态

为什么我不从
catch
获取console.log,然后执行

我也试过:

        service.login('user', 'password').then(function(token) {
            if (token) {
                localStorage.setItem('notes_token', token);
                localStorage.setItem('notes_username', 'user');
            }
            console.log('token: ' + token);
        }, function(error) {
            console.log(error);
        });
得到同样的结果。我使用的是angular 1.6.3。

避免使用!尽量不要使用
$q.defer()
。当您的
rpc()
函数拒绝其结果承诺时,您只是忽略了这一点-一个
未处理的拒绝

您将要使用

this.$get = ['$http', '$q', function($http, $q) {
    function rpc(method, params) {
        return $http({
            method: 'POST',
            url: uri,
            data: request(method, params)
        }).then(response => response.data);
    }
    return rpc('system.describe').then(data => {
//  ^^^^^^
        var service = {};
        for (const spec of data.result.procs) {
            service[spec.name] = function(...args) {
                if (args.length == spec.params.length) {
                    return rpc(spec.name, args).then(data => {
                        if (data.error) {
                            throw data.error;
//                          ^^^^^
                        } else {
                            return data.result;
//                          ^^^^^^
                        }
                    });
                } else {
                    return $q.reject('Invalid arity expected ' +
//                  ^^^^^^^^^^^^^^^^
                                 spec.params.length +
                                 ' got ' +
                                 args.length);
                }
            };
        }
        return service;
//      ^^^^^^
    });
}];

避开这个!“尽量不要使用$q.defer()”--对不起,我不明白这一点$q、 延迟被广泛使用。它应该只在最低级别使用。如果调用的是异步函数,则不需要
$q.defer
-函数应返回承诺。只有对于不能修改的函数,您才需要编写一个使用延迟函数的包装器。是的,
$q.defer
的许多用法被误导了。
this.$get = ['$http', '$q', function($http, $q) {
    function rpc(method, params) {
        return $http({
            method: 'POST',
            url: uri,
            data: request(method, params)
        }).then(response => response.data);
    }
    return rpc('system.describe').then(data => {
//  ^^^^^^
        var service = {};
        for (const spec of data.result.procs) {
            service[spec.name] = function(...args) {
                if (args.length == spec.params.length) {
                    return rpc(spec.name, args).then(data => {
                        if (data.error) {
                            throw data.error;
//                          ^^^^^
                        } else {
                            return data.result;
//                          ^^^^^^
                        }
                    });
                } else {
                    return $q.reject('Invalid arity expected ' +
//                  ^^^^^^^^^^^^^^^^
                                 spec.params.length +
                                 ' got ' +
                                 args.length);
                }
            };
        }
        return service;
//      ^^^^^^
    });
}];