Как вернуть родительское наблюдаемое значение? - PullRequest
2 голосов
/ 19 мая 2019

Я пытаюсь вложить некоторые http-запросы, используя mergeMap. Используемый мной API возвращает данные по частям (страницам), поэтому мне нужно делать больше запросов в зависимости от общего количества страниц.

Так как мне нужно сделать запрос, чтобы узнать, сколько страниц. Я всегда делаю первый на первой странице. Благодаря этому я могу узнать, сколько страниц, и начать делать другие запросы (начиная со страницы 2).

Как только я подписываюсь на возвращаемую наблюдаемую информацию, я получаю все данные запросов, выполненных в пределах mergeMap, за исключением результата первого (тот, у которого page = 1).

Есть ли способ вернуть данные первого запроса?

Я пытался запустить внутренний запрос с page = 1, но мне это не нравится, потому что у меня уже есть данные этого запроса.

Это возвращаемое значение функции:

 return this.getScrobblesFromAPI( userName, oneWeekAgoUnix, 1 )
    .pipe(
      mergeMap( data => {
        const totalPages: number = parseInt(data['recenttracks']['@attr'].totalPages, 10);
        const pages: number[] = [];
        //Starting from page 2
        for (let i = 2; i <= totalPages; i++) {
          pages.push(i);
        }
        return from(pages).pipe(
          mergeMap( page => this.getScrobblesFromAPI(userName, oneWeekAgoUnix, page)),
        );
      }),
      map( data => data['recenttracks']['track'].slice(1) )
  );

Эта функция возвращает наблюдаемое для http.get () (HttpClient)

private getScrobblesFromAPI( userName: string, from: number, page: number ){
   // http : HttpClient
   return this.http.get('url & params');
} 

1 Ответ

0 голосов
/ 19 мая 2019

Я могу придумать два варианта решения этой проблемы:

  1. Создайте пустой массив и поместите туда все свои данные. В конце внешнего канала верните этот массив, чтобы он перешел в обратный вызов подписки.
  2. просто используйте функцию concat для объединения данных из первого вызова с дополнительными Observables, которые будут извлекать оставшиеся страницы.

    return concat(
        of(data), 
        from(pages).pipe(
          mergeMap( page => this.getScrobblesFromAPI(userName, oneWeekAgoUnix, page)),
        )
    );
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...