Можно ли создать цикл обещаний до отклонения в angular

Я хочу загрузить ~ 10000 ресурсов, и выполнение всего этого сразу на этапе разрешения занимает слишком много времени из-за выполнения определенных вычислений. Затем я пришел к идее загружать ресурсы страница за страницей последовательно, однако, поскольку все эти ресурсы должны быть видны (на карте), стандартная разбивка на страницы, основанная на вводе пользователем, на самом деле не работает.

Я знаю, что обещания могут быть связаны как:

promise.then(doThis).then(doThat).then(doWhat);

И я знаю, что массив обещаний можно разрешить с помощью $q.all, например:

$q.all([doThis, doThat, doWhat]);

Однако я хочу повторять одно и то же обещание снова и снова, пока не получу отказ.

Пример:

function next() {
  var deferred = $q.defer();
  if(someCondition) {
    deferred.reject();
  } else {
    //do something
    //store data somewhere
    deferred.resolve();
  }

  return deferred.promise;
}

Допустим, эта функция делает несколько $http вызовов и сохраняет результат где-то в сервисе/контроллере. Если он попадает в определенное условие (возможно, больше нет страниц или ошибка http), он отклоняет обещание, в противном случае он разрешает его.

Теперь я хотел бы сделать что-то вроде этого псевдокода

$q.loop(next).untilError(handleError);

Где next будет вызываться в цикле после разрешения предыдущего вызова next до отклонения.

Возможно ли что-то подобное?


person MrPlow    schedule 24.08.2015    source источник


Ответы (1)


Проверьте консоль этой демонстрации: JSFiddle.

Это гарантирует, что вызовы API используют userId от 1 до 5 последовательно. И остановиться на каком-нибудь условии (userId > 5).

angular.module('Joy', [])
    .controller('JoyCtrl', ['$scope', '$http', function ($scope, $http) {

    getUser(1, getUser);

    function getUser(userId, next) {
        if (userId > 5) {
            console.log('Enough. Stop');
            return;
        }
        $http.get('http://jsonplaceholder.typicode.com/posts?userId=' + userId).then(function (data) {
            console.log(data.data);
            next(userId + 1, next);
        });
    }
}]);
person Joy    schedule 24.08.2015