当我知道请求在服务器端失败时,我想知道如何模拟promise $ http。这是我的代码:
if ( !ng.isString(email) ) {
var promise = $q.defer().promise;
$q.reject();
return promise;
}
return $http( {
method : "PUT",
url : "//localhost/update" ,
data : { data: email }
})
// Success handler
.success(response){ return response})
// Error handler
.error(errorMsg){ return errorMsg});
答案 0 :(得分:5)
您可以使用resolve和reject来控制数据流:
假设你有这样的服务:
var app = angular.module("mymodule.services", []);
app.factory("HttpRequest", ['$q', '$http', function(q, http) {
var deferredData = q.defer();
http.get('http://your-server.local/data.json').success(function(data) {
//success, resolve your promise here
deferredData.resolve(data);
}).error(function(err) {
//error, use reject here
deferredData.reject(err);
});
return {
get: function() {
return deferredData.promise;
}
};
}]);
然后可以使用该服务:
var app = angular.module("mymodule.controllers", ['mymodule.services']);
app.controller("MyCtrl", ['HttpRequest', '$scope', function(res, scope) {
//the "then"-method of promises takes two functions as arguments, a success and an erro callback
res.get().then(function(data) {
//first one is the success callback
scope.data = data;
},
function(err) {
scope.err = err;
});
}]);
您可以在第二次回调中处理错误。
答案 1 :(得分:5)
好的,我可以弄清楚如何模拟$ http对象返回的相同承诺。感谢大家的回答。我可以把它们都考虑进去。这是我的解决方案:
if ( !ng.isString(email) ) {
// We need to create a promise like the one returned by the
// $http object (with the success and error methods)
// to stay consistent.
var promise = $q.reject("error with email");
// Defining success and error method for callbacks.
// but it should never be called since the promise
// is already rejected.
promise.success = function(fn){
promise.then(function(response){
fn(response)
}, null);
return promise
};
promise.error = function(fn){
promise.then(null, function(response){
fn(response)
});
return promise;
};
return promise;
}
return $http( {
method : "PUT",
url : "//localhost/update" ,
data : { data: email }
})
// Success handler
.success(response){ return response})
// Error handler
.error(errorMsg){ return errorMsg});
答案 2 :(得分:3)
$http
在angularJS中返回一个承诺。你可以这样做:
var promise = $http(...) ;
promise.then(function(data) {}, function(error){});
您可以在jQuery ajax调用中查找成功和错误函数,但在angularJS中可以使用不同的东西。您可能需要遵循它才能使其正常工作。
您可以告诉我们更多关于您为什么需要使用成功和错误的原因,以便我们找到一种方法使其适用于您的案例。
答案 3 :(得分:1)
这样的事情应该有效:
if ( !ng.isString(email) )
return $q.reject("Email is invalid."); // returns rejected promise
return $http( {
method : "PUT",
url : "//localhost/update" ,
data : { data: email }
});
然后在您的代码中将其用作常规承诺
mypromise.then(function(x) { do something with x.data }, function(error) { alert(error)});
答案 4 :(得分:1)
使用下面的建议(并调试Angularjs代码),我找到了一种允许拒绝或解决的更简化的方法。
if (alreadyLoaded){
var defered = $q.defer();
defered.success = function(fn){
defered.promise.then(fn);
return defered;
};
defered.error = function(fn){
defered.promise.then(null, fn);//or defered.promise.catch(fn)
return defered;
};
if(data.invalid)
defered.reject("arbitrary error");
else
defered.resolve(data);
return defered;
}else {
return $http.get(...);
}
(success
和error
方法返回this
以允许排队回调)
答案 5 :(得分:0)
你的语法有点搞砸了。试试这个:
var deferred = $q.defer();
$q.reject();
return deferred.promise;