解决错误无效

时间:2015-01-23 10:58:33

标签: routing angular-ui-router restangular

我正在使用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有什么问题?如何解决?

1 个答案:

答案 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);
}