我正在使用ui.router和Restangular。
在$stateProvider
我的状态为
resolve: {
dane: function (daneTematy) {
var promise = daneTematy.getItem(-1);
return promise;
}
}
对于测试,它始终是错误并执行$stateChangeError
这是来自服务的函数:
function getItem(id, params) {
return Restangular.one(zrodlo, id).get()
.then(getItemSuccess)
.catch(restangularError);
function getItemSuccess(response) {
$log.info('Mam dane elementu - Źródło: ' + zrodlo);
response.doHistorii();
return response;
}
}
function restangularError(response) {
$log.error("Error with status code", response.status);
return response;
}
它不起作用 - 它到达restangularError
但不到$stateChangeError
。当我删除catch
时效果很好:
function getItem(id, params) {
return Restangular.one(zrodlo, id).get()
.then(getItemSuccess);
function getItemSuccess(response) {
$log.info('Mam dane elementu - Źródło: ' + zrodlo);
response.doHistorii();
return response;
}
}
restangularError
有什么问题?如何解决?
答案 0 :(得分:1)
在错误处理程序中,您将错误标记为已解决。因此ui-router
获得已解决的承诺,因此不会导致$stateChangeError
。
要解决此问题,如果无法解决问题,则必须在错误处理程序中拒绝承诺。请参阅angular documentation:
将延迟/承诺与熟悉的行为进行比较 try / catch / throw,将reject视为JavaScript中的throw关键字。 这也意味着,如果你"赶上"通过承诺错误的错误 回调,您希望将错误转发给派生自的承诺 当前的承诺,你必须"重新抛出"返回一个错误 通过拒绝构建拒绝。
promiseB = promiseA.then(function(result) {
// success: do something and resolve promiseB
// with the old or a new result
return result;
}, function(reason) {
// error: handle the error if possible and
// resolve promiseB with newPromiseOrValue,
// otherwise forward the rejection to promiseB
if (canHandle(reason)) {
// handle the error and recover
return newPromiseOrValue;
}
return $q.reject(reason);
});
对于您的情况,这只是意味着您必须按如下方式修改错误处理程序(确保$q
可用):
function restangularError(response) {
$log.error("Error with status code", response.status);
return $q.reject(response);
}