Angularjs 使用$q的reject and catch时可能存在未处理的拒绝
我有这样的JSON-RPC提供程序(通过babel和webpack传输): 我称之为一个函数: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
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;
// ^^^^^^
});
}];