如何使用$ q服务暂停迭代?

时间:2019-06-27 08:07:01

标签: angularjs

我试图使用$ q服务在迭代中暂停,因为我有循环进行API调用的条件。

我使用了以下方法:

function getData(id){
   var deferred = $q.defer();
   var data;
   Restangular.all("some/api").post(id)
       .then(function (result) {
            data = result;
            doSomeFurtheProcessingWithData(data);
            console.log("Data fetched for "+id);
            deferred.resolve(data);
         }, function(error) {
              deferred.resolve(data);
         });
   return deferred.promise;
}

function getDataOneByOne(ids){
   for(var i=0;i<ids.length;i++){
      console.log("Fetching details for "+ ids[i]);
      getData(ids[i]);
   }
}

我希望结果是

  

获取101的详细信息
获取101的数据
获取102的详细信息
  提取102的数据
提取103的详细信息
提取103的数据

但是上面代码给出的实际结果是

  

获取101的详细信息
获取102的详细信息
获取   103的详细信息
提取101的数据
提取的数据   102
已获取103的数据

3 个答案:

答案 0 :(得分:1)

您可以尝试使用await / async在遍历循环之前等待promise返回吗?像下面一样

function getData(id){
   var deferred = $q.defer();
   var data;
   Restangular.all("some/api").post(id)
       .then(function (result) {
            data = result;
            doSomeFurtheProcessingWithData(data);
            console.log("Data fetched for "+id);
            deferred.resolve(data);
         }, function(error) {
              deferred.resolve(data);
         });
   return deferred.promise;
}



function getDataOneByOne(ids){
  if(ids.length > 0){
    var id = ids.shift();
    console.log("Fetching details for "+ id);
    getData(id).then(function(){
      getDataOneByOne(ids);
    });

  }

}

getDataOneByOne([1,2,3,4,5,]);

答案 1 :(得分:0)

答案 2 :(得分:0)

可以使用递归和全局索引进行模拟。异步,等待解决方案仍然更好:

   var index = 0; 
   function getDataOneByOne(ids){
       if (index >= ids.length){
          return;
       }
       console.log("Fetching details for "+ ids[index]);
       getData(ids[index]).then(function () {
           index++;
           getDataOneByOne(ids);
       });
    }