Сращивание массива для добавления в существующий массив - PullRequest
0 голосов
/ 10 февраля 2019

Я использую rss2json , чтобы использовать RSS-канал.Для включения нумерации страниц нет параметра page.Существует параметр count, который я могу передать в запрос.Я могу загрузить канал и получить результаты обратно.Я создал сервис, используя ionic , чтобы сделать запрос на получение фида:

getRssFeed(rssUrl: string, count: number) {
    return new Promise<any>(resolve => {
        this.http.get(`${ environment.podcast.baseUrl }?rss_url=${ rssUrl }&api_key=${ environment.podcast.apiKey }&count=${ count }`)
            .subscribe(data => {
                resolve(data);
            }, error => {
                console.error('Something really bad happened trying to get rss feed.');
                console.error(error);
            });
    });
}

Это прекрасно работает.Я могу получить данные обратно - все хорошо.Я использую компонент бесконечной прокрутки для обработки нумерации страниц.Опять все хорошо.Я начинаю с 10 эпизодов подкаста.Я выхожу из системы, когда хочу загрузить больше эпизодов:

enter image description here

Когда я выполняю прокрутку, служба выполняет правильный вызов, но из-за rss2jsonсервис не имеет параметра page, он вернет весь массив при обновлении count.

Так что мне нужно сделать что-то вроде этого:

episodes: Array<any>;
count = 10;

...

this.episodes.splice(this.episodes.length, this.count, data.items);

Мне нужночтобы узнать, сколько серий у меня уже есть.Когда я в первый раз попаду в мой список, у меня будет 10 (я хочу увеличить +10 на каждую загрузку).Поэтому мне нужно:

  • Узнать, сколько у меня сейчас эпизодов (10, 20, 30 и т. Д.)
  • Сделать запрос, чтобы получить больше эпизодов
  • Сервис возвращает 20 эпизодов - но он будет всегда начинаться с нуля.
  • Нарезать первые 10, 20, ??эпизоды, которые возвращаются, добавьте оставшиеся 10 в конец списка.

Я не уверен, как этого добиться, и могу использовать какое-то направление.

Вот как язапросить больше эпизодов:

 this.myPodcastService.getRssFeed(this.rssUrl, this.count)
     .then(data => {
         if (data) {
             // console.log('data', data.items);
             // data is an object
             // data.items is an array of episodes

             // this.episodes.splice(this.episodes.length, this.count, data.items);
         } else {
             ...
         }
          ...
      });

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

Служба вернет 20 элементов.Первые 10 я хочу удалить (они уже на экране).Мне нужны только последние 10 эпизодов ...

Теперь у меня будет 20 эпизодов.При следующей прокрутке мне нужно увеличить count до 30.Сервис вернет массив из 30 элементов.Мне нужно будет удалить (склеить) первые 20;оставив только последние 10 - затем добавьте это в массив episodes.

В журнале должно отображаться что-то вроде:

this.episodes[10]
this.episodes[20]
this.episodes[30]

Надеюсь, это имеет смысл.Я знаю, чего я пытаюсь достичь, я изо всех сил, как на самом деле это сделать.Спасибо за любые предложения!

РЕДАКТИРОВАТЬ / РЕШЕНИЕ

Большое спасибо за предложение!В случае, если кто-то еще сталкивается с этим, вот что я придумал, что делает именно то, что мне нужно.

// load more episodes using infinite scroll.
loadMoreEpisodes(event) {
    console.log('--> loading more episodes');

    this.count = (this.count + this.count);  // 10, 20, 30...

    this.myPodcastService.getRssFeed(this.rssUrl, this.count)
        .then(data => {
            if (data) {
                // append the new episodes to the existing array
                this.episodes.push(...data.items.splice(-this.episodes.length, this.count));
                event.target.complete();
                console.log('this.episodes', this.episodes);
            } else {
                this.alertCtrl.create({
                    header: 'Error',
                    subHeader: 'Something bad happened',
                    message: 'Something internet related happened & we couldn\'t load the playlist.',
                    buttons: [{ text: 'Ok', role: 'cancel' }]
                }).then(alert => {
                    alert.present();
                });
            }
        });
}

1 Ответ

0 голосов
/ 10 февраля 2019

Учитывая, что API не предоставляет средства для получения конкретных данных, когда клиент должен запрашивать дубликаты данных, вы можете .splice() из конца массива

this.episodes.push(...data.splice(-10, 10))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...