我想循环遍历数组以角度执行$ http.jsonp请求,但每个请求将略有不同,具体取决于前一个$ http.jsonp请求的时间戳。我正在尝试遍历5个请求,每个请求都依赖于之前的请求信息。
如何执行等待每个$ http请求完成的foreach循环,以便为循环中的下一个$ http请求正确更新“lastTime”变量?
这是我的代码:
var lastTime = null;
function hitUrl(url){
var defer = $q.defer();
$http.jsonp(url).then(function(res){
console.log(endPoint);
console.log(res);
defer.resolve(res.lasttimestamp);
})
return defer.promise;
};
angular.forEach(hashArray,function(){
if (lastTime = null){
var endPoint = "https://api.com/?callback=JSON_CALLBACK";
}else{
var endPoint = "https://api.com/?aftertimestamp="+lastTime+"&callback=JSON_CALLBACK";
}
hitUrl(endPoint).then(function(res){
console.log(res);
lastTime=res;
})
});
感谢您的帮助!
解决方案
function hitUrl(endPoint){
return $http.jsonp(endPoint);
};
var promise;
for(var i=0;i<5;i++){
if(!promise){
promise = hitUrl("https://api.com/&callback=JSON_CALLBACK");
}else{
promise=promise.then(function(res){
return hitUrl("https://api.com/?aftertimestamp="+lastTime+"&callback=JSON_CALLBACK");
})
}
}
答案 0 :(得分:3)
在循环遍历数组/哈希时,您需要继续链接每个后续请求。
概念上它看起来像这样:
function callServiceForEachItem() {
var promise;
angular.forEach(items, function(item) {
if (!promise) {
//First time through so just call the service
promise = fakeService.doSomething(item);
} else {
//Chain each subsequent request
promise = promise.then(function() {
return fakeService.doSomething(item);
});
}
});
}
只是为了更好地理解,here is a Plunker that shows how to perform this chaining。