等待所有$ http.get完成

时间:2016-07-10 16:59:49

标签: angularjs ionic-framework deferred

我对此感到有点困惑。我在函数内部有两个get调用。一旦这个完整的函数,即两个get调用完成,只有这个函数完成它的工作。我应该如何使用$ q来实现我的工作?这就是我现在所拥有的:

function updateBlackList() {
    $http.get("http://127.0.0.1:8000/blacklist/entries/vehicle").then(function (res){
      console.log(res)    
      }).catch(function (err) {
        console.log(err)
      });


    })
    $http.get("http://127.0.0.1:8000/blacklist/entries/person").then(function (res){
      console.log(res)     
      }).catch(function (err) {
        console.log(err)
      });


    });
    return $q.when();

  }

这里有另一个函数我需要等待上面的函数完成:

BlackListService.updateBlackList().then(function() {
              addVersion(server_version).then(function () {
                console.log("Blacklist update complete")
              })
            })

它没有像我怀疑那样做。在完成tw get请求之前调用Blacklist完成控制台

2 个答案:

答案 0 :(得分:3)

您希望将两个承诺合并为$q.all()

function updateBlackList() {
  return $q.all([
    $http.get("http://127.0.0.1:8000/blacklist/entries/vehicle")
    .then(function (res){console.log(res)})
    .catch(function (err) {console.log(err)}),

    $http.get("http://127.0.0.1:8000/blacklist/entries/person")
    .then(function (res){console.log(res)})
    .catch(function (err) {console.log(err)});
  ]);
}

此外,对于您的第二个示例,您可以链接承诺以获得更好看的代码:

BlackListService.updateBlackList()
.then(function() {
  return addVersion(server_version);
})
.then(function () {
  console.log("Blacklist update complete");
})

答案 1 :(得分:2)

使用$q.all

var VEHICLE_URL = "http://127.0.0.1:8000/blacklist/entries/vehicle";
var PERSON_URL = "http://127.0.0.1:8000/blacklist/entries/person";

function updateBlackList() {
  var p1 = $http.get(VEHICLE_URL).then(whatever);
  var p2 = $http.get(PERSON_URL).then(whatever);

  return $q.all([p1, p2]);
}

updateBlackList()
  .then(whateverElse);