除非使用.success和.error,否则.then()中的错误处理程序不会被触发

时间:2014-07-24 20:05:15

标签: javascript angularjs promise

我正在编写一个处理Angular $ http结果的函数。在我的$ http请求中,我使用.then()来处理结果。

var GET = function (url) {
  return $http({
    method: 'GET',
    url: url
  }).then(
  function (data) {
    return data.data;
  },
  function (data) {
    return data.data;
  });
};

然后我从另一个函数调用GET函数,如下所示:

var initializeUsers = function () {
  return dbService.GET(serverUrl + dbResource).then(
  function (data) {
      // Some code to handle success
  },
  function (data) {
    // Some code to handle error
  });
};

问题在于:如果HTTP请求中存在错误,则由GET函数中的错误处理程序处理。但是,当initializeUsers运行时,错误处理程序不会被触发,而是成功处理程序。所以这个错误没有"冒泡"应该

但是,如果我,而不是在GET函数中使用.then,我会使用.success.error,如下所示:

var GET = function (url) {
  return $http({
    method: 'GET',
    url: url
  }).success(
  function (data) {
    return data.data;
  }).error(
  function (data) {
    return data.data;
  });
};

它在initializeUsers中运行良好。但是,如果我然后使用initializeUsers从另一个函数调用.then,则不会触发其中的错误处理程序。我似乎必须一直使用.success.error,据我所知,这不是它应该如何工作的。 只要我在每个函数上明确使用.error以实际捕获错误,否则错误会丢失,下一个函数就像最后一个函数成功一样。

我误解了,或者我的代码出了什么问题?

1 个答案:

答案 0 :(得分:3)

如果您从承诺的错误回调中return,它实际上会返回已解决(未拒绝)的承诺。请改用throw,结果承诺将被拒绝......

var GET = function (url) {
  return $http({
    method: 'GET',
    url: url
  }).then(
  function (data) {
    return data.data;
  },
  function (data) {
    throw data.data;  // use throw here
  });
};