成功时拒绝$ http承诺

时间:2015-01-21 20:30:34

标签: javascript angularjs

我有一个返回$ http GET承诺的函数(承诺成功/错误由调用者处理)。我需要的是,在某些条件下,即使$ http成功,也会返回一个错误(调用者会将此条件视为被拒绝的承诺)。

在这个插件中,我试图返回$ q.reject(),但这不起作用。

http://plnkr.co/edit/iC3Wb1PBUFrXgPbTJyU0?p=preview

这是JavaScript:

app.controller("ctrl", function($scope, $http) {
  var getUrl = function() {
    var config = {
      method: 'GET',
      url: 'some.txt'
    };
    var x = 1; // if x == 1 the http should fail
    return $http(config).success(function(response, status, headers, config) {
      console.log(response);
      if (x == 1) return $q.reject('error');
    }).error(function(data, status, headers, config) {});
  };
  var init = function() {
    var promise = getUrl();
    promise.then(function() {
      alert('OK');
    }, function() {
      alert('error');
    });
  };
  init();
});

有什么想法吗?

2 个答案:

答案 0 :(得分:7)

$http.success()error()是方便快捷方式,不是100%符合承诺。请使用vanilla promise then代替:

$http(config).then(function(response){return $q.reject}, function onError(reason){})

updated plunker

答案 1 :(得分:4)

试试这个:http://plnkr.co/edit/hTNFjXXDfqQ7e7jvNMtg?p=preview

您返回自己的延期承诺,并且

将解决/拒绝
 var defer = $q.defer();


          $http(config)
              .success(function (response, status, headers, config) {
                  console.log(response);

                  if (x == 1)
                       defer.reject('error');
                 else
                  defer.resolve(response);

              })
                .error(function (data, status, headers, config) {
              });

              return defer.promise;