迭代地调用angularjs-service

时间:2014-01-08 22:40:41

标签: angularjs angularjs-service

我有一个id数组,并希望迭代它们并将它们传递给服务以获取一些数据。但是我想在前一个id处理完成后才转到下一个id。获取完所有数据后,我需要调用一个特定的函数。

我的代码(没有迭代)会像

MyService.fetch(id)
        .success(function (data, status, headers, config) {
            doSomething();
        });

我想要实现的是这样的东西,但是能够处理我的id数组中未知数量的项目:

MyService.fetch(id).success(function (data, status, headers, config) 
{
   MyService.fetch(id2).success(function (data, status, headers, config) 
   {
     doSomething();
   });
});

任何想法如何实现这一目标?

感谢

托马斯

3 个答案:

答案 0 :(得分:3)

Angular附带一个精简版承诺库:$q。 这实际上很简单。

<强>服务

myApp.factory('theProcessor', function($q, $timeout) {

  return {
    fetch: function(queue, results, defer) {

      defer = defer || $q.defer();

      var self = this;  

      // Continue fetching if we still have ids left

      if(queue.length) {

        var id = queue.shift();

        // Replace this with your http call
        $timeout(function() {
          // Don't forget to call d.resolve, if you add logic here 
          // that decides not to continue the process loop.
          self.fetch(queue, results, defer);
          results.push({ id: id, value: Math.floor((Math.random()*100)+1) });
        }, 500);

      } else {

        // We're done -- inform our caller 
        defer.resolve(results);
      }

      // Return the promise which we will resolve when we're done
      return defer.promise;
    },
  };

});

this plunker看到它的实际效果。

答案 1 :(得分:2)

尝试使用以下方法:

var idsArray= [], result = [];

/// ...After filling array

function nextIteration(index) {
   MyService.fetch(idsArray[index]).success(function (data, status, headers, config)
   {
      result.push(data);
      if (++index < idsArray.length) {
         nextIteration(index)
      } else {
         console.log('Task complete');
      }
}

nextIteration(0);

答案 2 :(得分:1)

您可以使用$q的{​​{1}}方法捆绑您定义的所有承诺,然后在解析所有之后执行某些操作,例如:

all()

您可能需要考虑在控制器或服务中实施此功能。

请查看HERE以获取完整的API参考和详细信息。

<强>更新

只是认为你的服务可以接受一组id,它可能有一个方法可以按你想要的方式递归地获取数据。看看和下面的代码,这是一个想法,所以它可能无法正常工作:

$q.all([promise1, promise2, ...]).then(...)