angularjs foreach循环通过依赖于先前请求的http请求

时间:2014-11-26 19:36:38

标签: javascript angularjs foreach scope

我想循环遍历数组以角度执行$ 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");
                })
          }
        }

1 个答案:

答案 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