Вопрос

У меня есть массив идентификаторов и хотел бы повторить их и передавать их на сервис, чтобы получить некоторые данные.Но я хотел бы перейти только к следующему идентификатору после завершения обработки предыдущего идентификатора.После того, как все данные были выделены, мне нужно позвонить в определенную функцию.

Мой код (без итерации) Wold - что-то вроде

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

Что я хочу достичь, это что-то подобное, но таким образом, что может справиться с неизвестным количеством элементов в моем массиве IDS:

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

Есть идеи, как это достичь?

Спасибо

Томас

Это было полезно?

Решение

Угловой поставляется с библиотекой Lite Promacy: $ 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;
    },
  };

});
.

Увидеть его в действии в Этот пункт .

Другие советы

Попробуйте использовать следующий подход:

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);
.

Вы можете использовать метод $q all() для соединения всех обещаний, которые вы определяете, а затем сделаете что-то после Все из них разрешены E.g:

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

Вы можете рассмотреть возможность реализации этой функции в вашем контроллере или на вашем сервисе.

Посмотрите на Здесь для полной ссылки на API и детали.

.

<Сильное> Обновление

Просто думать, что ваш сервис может принять массив идентификаторов и может иметь метод, который будет рекурсивно получать данные, чтобы вы хотите.Посмотрите и следующий код, это идея, поэтому она может не работать так:

function(){
    var result = [];
    var fetch = function(idArr /*this is your ID array*/){

          (a simple guess if what you want to do with that ID)
          $http.get('yourURL?id=' + <first element of idArr>)
            .success(function(data){
                //some logic
                result.push(data);
                idArr.splice(1,0);
                fetch(idArr);
            });
    }
}
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top