Javascript 多个$http上的角度承诺
我正在尝试执行多个Javascript 多个$http上的角度承诺,javascript,angularjs,promise,angular-promise,Javascript,Angularjs,Promise,Angular Promise,我正在尝试执行多个$http调用,我的代码如下所示: var data = ["data1","data2","data3"..."data10"]; for(var i=0;i<data.length;i++){ $http.get("http://example.com/"+data[i]).success(function(data){ console.log("success"); }).error(function(){ cons
$http
调用,我的代码如下所示:
var data = ["data1","data2","data3"..."data10"];
for(var i=0;i<data.length;i++){
$http.get("http://example.com/"+data[i]).success(function(data){
console.log("success");
}).error(function(){
console.log("error");
});
}
var data=[“数据1”、“数据2”、“数据3”…“数据10”];
for(var i=0;i如果您希望在第一个错误时爆发,则需要使for循环同步,如下所示:
如果希望它是异步的,那么:
app.controller(“AppCtrl”,函数($scope,$http,$q){
变量数据=[“数据1”、“数据2”、“数据3”、“数据10”];
$q.all([
对于(变量i=0;i
这篇文章也很好:您还可以使用$q.all()
方法
因此,从您的代码:
var data = ["data1","data2","data3"..."data10"];
for(var i=0;i<data.length;i++){
$http.get("http://example.com/"+data[i]).success(function(data){
console.log("success");
}).error(function(){
console.log("error");
});
}
这基本上意味着执行整个请求,并在所有请求完成后设置行为
使用status可以知道是否有错误。如果需要,还可以为每个请求设置不同的配置(例如超时)
如果其中任何一个失败,将执行某些操作。
也是
接受的答案是可以的,但仍然有点难看。您有一个要发送的内容数组。与其使用for
循环,为什么不使用array.prototype.map
var data = ["data1","data2","data3"..."data10"];
for(var i=0;i<data.length;i++){
$http.get("http://example.com/"+data[i]).success(function(data){
console.log("success");
}).error(function(){
console.log("error");
});
}
这使用了一个更高阶的函数,所以你不必为
循环使用,看起来也更容易看。否则,它的行为与发布的其他示例相同,因此这是一个纯粹的美学变化
关于success
vserror
-success
和error
的一个警告词更像是回调,是你不知道承诺如何工作/没有正确使用它的警告。承诺然后和catch
将链接并返回到目前为止封装该链接的新承诺,而h是非常有益的。此外,使用success
和error
(除了$http
的调用站点之外的任何其他地方)都是一种气味,因为这意味着您明确地依赖于一个有角度的http承诺,而不是任何符合a+的承诺
换句话说,尽量不要使用success
/error
——它们很少有原因,而且几乎总是表示有代码气味,因为它们会带来副作用
关于你的评论:
我在$q.all上做了一个非常简单的实验。但它只有在所有请求都成功时才会触发。如果一个请求失败,什么也不会发生
这是因为
所有
的合同是,如果每个承诺都是成功的,它就会解决;如果至少有一个承诺是失败的,它就会拒绝
不幸的是,Angular的内置$q
服务只有all
;如果您希望拒绝的承诺不会导致最终的承诺被拒绝,那么您需要使用allsolited
,这在大多数主要的承诺库中都存在(如Bluebird和kriskowal的原始q
).另一个选择是自己滚(但我建议蓝鸟).你可能想研究一下$q
服务,特别是$q.all
@CollinD我在$q.all
上做了一个非常简单的实验。但它只在所有请求成功时触发。如果一个请求失败,什么也不会发生。如果一个请求失败,什么也不会发生-你在使用它。这一切都错了case@user1995781再ason出现这种情况是因为这是all
的预期行为。如果您希望在拒绝子承诺的情况下解析聚合承诺,则需要研究使用allsolited
。不幸的是,Angular的$q
库中没有此方法,但它位于承诺的大型库中,例如e Bluebird.谢谢你的回答。我尝试过你的解决方案,但当其中一个失败时,它什么也没有做。当其中一个失败时,我如何得到响应?我添加了更新的答案,尝试使用。然后,.catch,.finally而不是.success,.error。如果仍然不起作用,你能在上中断for循环吗?catch或error我添加了一个同步场景ARIO。这是你真正想要的一个循环,它会在第一次中断时失败吗?请考虑编辑你的帖子来对你的代码做什么以及为什么它会解决这个问题做更多的解释。通常不会帮助OP理解他们的问题。谢谢你的回答。尝试使用你的代码。如果一个失败,它不会执行$q.all(承诺)中的代码。然后(函数(结果){
哪一个失败?你能多分享一点你的代码吗?我的意思是如果$http
调用中的任何一个失败(例如,返回404错误),它将不执行$q.all()
code。我正在编写实验代码。因此,代码与您提供的答案一样清晰。请检查我上次的编辑,添加第二个回调,甚至在您进行实验时添加第三个回调。Angular会将200到299之间的任何状态代码解释为成功,其余代码解释为错误,因此您可以使用带有相同参数的errorCallback
var data = ["data1","data2","data3"..."data10"];
for(var i=0;i<data.length;i++){
$http.get("http://example.com/"+data[i]).success(function(data){
console.log("success");
}).error(function(){
console.log("error");
});
}
var promises = [];
data.forEach(function(d) {
promises.push($http.get('/example.com/' + d))
});
$q.all(promises).then(function(results){
results.forEach(function(data,status,headers,config){
console.log(data,status,headers,config);
})
}),
$q.all(successCallback, errorCallback, notifyCallback);
var data = ["data1","data2","data3"..."data10"];
for(var i=0;i<data.length;i++){
$http.get("http://example.com/"+data[i]).success(function(data){
console.log("success");
}).error(function(){
console.log("error");
});
}
var data = ['data1', 'data2', 'data3', ...., 'data10']
var promises = data.map(function(datum) {
return $http.get('http://example.com/' + datum)
})
var taskCompletion = $q.all(promises)
// Usually, you would want to return taskCompletion at this point,
// but for sake of example
taskCompletion.then(function(responses) {
responses.forEach(function(response) {
console.log(response)
})
})