Цепочка обещаний Angularjs при работе с разбитой на страницы коллекцией

Я работаю с REST API, который предоставляет разбивку на страницы для запросов GET, например:

{count: 43103
previous: null
next: http://ecoengine.berkeley.edu/api/photos/?page=2
results: [json objects....]
}

Я хотел бы создать службу, которая загружает все данные, следуя ссылке next, пока next не станет нулевым. Я застрял в том, как связать обещания в этом сценарии, и был бы признателен за любую помощь в том, как действовать (новичок angular/js здесь). Мой плункер с тем, что я получил до сих пор, находится здесь http://plnkr.co/edit/ySiQLvu9RNrKkQAoDmKh . Из сообщений консоли видно, что код извлекает данные только с первых двух страниц. Спасибо.


person user3026676    schedule 24.11.2013    source источник
comment
Вы получите лучшую помощь, если включите код в свой пост и лучше объясните, что вы пробовали и в чем ваше препятствие.   -  person Dave Alperovich    schedule 24.11.2013
comment
Сделаю это в следующий раз, когда задам вопрос. На данный момент я приму ответ Чандермани. Спасибо.   -  person user3026676    schedule 24.11.2013


Ответы (1)


Я попытался выполнить цепочку обещаний, используя рекурсию, чтобы решить этот сценарий. Смотрите мою скрипку здесь

http://plnkr.co/edit/NPh6uQ2DgVuhVxUgHB6h?p=info

В основном рекурсия, выполненная на loadData, может получить выгружаемые данные. Это реализация

var loadData = function(url) {
      var deferred = $q.defer();

      function loadAll() {
        $http.get(url)
           .then(function(d) {
                debugger;
                console.log('private http.get().then()');
                console.log(d);
                aggregateData.value.push(d.data.results);
                if(d.data.next) {
                   url=d.data.next;
                   loadAll();
                }
                else {
                   deferred.resolve(aggregateData.value);
                }
           })
      }
      debugger;
      loadAll();
      return deferred.promise;

 };

Я использовал массив aggregateData, но вы можете использовать любой массив, объявленный в функции loadData.

person Chandermani    schedule 24.11.2013