我有一个返回$ 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();
});
有什么想法吗?
答案 0 :(得分:7)
$http.success()
和error()
是方便快捷方式,不是100%符合承诺。请使用vanilla promise then
代替:
$http(config).then(function(response){return $q.reject}, function onError(reason){})
答案 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;