Не могу получить массив Observables - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть метод, который должен возвращать массив внутри Observable. Я должен внести некоторые изменения в массив и только после этого вернуть его. Теперь я возвращаю только один элемент типа AlArticleShort. Как я могу вернуть массив типа AlArticleShort[]?

Response.shortArticlesInfo - это массив объектов типа AlArticleShort. Я должен выполнить некоторые действия с этим массивом и вернуть измененный массив.

public getArticles(): Observable<AlArticleShort[]> {
  return this.apiBaseService.get<GetArticlesResponse>('getBlogArticles').pipe(
    take(1),
    switchMap(response => {
      return response.shortArticlesInfo;
    }),
    map(article => {
      this.getAllArticlesTags$().subscribe(tags => {
        console.log(tags);
        return article.tags = tags.filter(tag => {
          return article.tagIds.includes(tag.id);
        });
      });
      return []
    }),
  );
}

Ответы [ 2 ]

0 голосов
/ 01 ноября 2019

Вы можете избежать использования второго канала, используя map вместо mergeMap или switchMap.
Кроме того, если вы хотите подписаться на теги только один раз, вы можете использовать withLatestFrom. * 1006. *

Окончательный результат должен выглядеть примерно так:

public getArticles(): Observable<AlArticleShort[]> {
    return this.apiBaseService.get<GetArticlesResponse>('getBlockArticles').pipe(
      take(1),
      withLatestFrom(this.getAllArticlesTags$()),
      map(([{ shortArticlesInfo }, tags]) => 
        shortArticlesInfo.map(article => {
           return {
             ...article,
             tags: tags.filter(tag => article.tagIds.includes(tag.id))
           }
        })
      )
    )
 }
0 голосов
/ 01 ноября 2019

Используйте pluck для сопоставления с данным атрибутом (в данном случае с вашим массивом статей). Используйте switchMap для отображения в Observable, который получает все теги и сопоставляет их с измененным массивом статей.

Вы уверены, что вам нужно take(1)? Если this.apiBaseService.get<GetArticlesResponse>('getBlogArticles') - это http-запрос, который отправляется только тогда, когда он вам не нужен.

Я думаю, что это должно делать то, что вы хотите:

public getArticles(): Observable<AlArticleShort[]> {
  return this.apiBaseService.get<GetArticlesResponse>('getBlogArticles').pipe(
    pluck('shortArticlesInfo'),
    switchMap(articles => this.getAllArticlesTags$().pipe(
      map(tags => {
        articles.foreach(a => a.tags = tags.filter(tag => a.tagIds.includes(tag.id)));
        return articles;
      })
    ))
  );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...