Angular Map и операторы mergeMap rxjs6 - PullRequest
0 голосов
/ 14 января 2019

Вопрос новичка:

Я пытаюсь экспортировать свои данные из остальных API в firebase.

Я использую Angular6 с RxJS 6 .

getByTag(tag:string) {
  return this.http.get(this.URL + '/get/listings/', { headers })
    .pipe(
      map((res: Listings) => res.items),
      // How do I add an additional property to each of these items? eg res.items.inserted = new Date();
      // How do chain each of these res.items to another function called exportToFirebase(res.item))
    );
}

Мои данные выглядят примерно так: https://pasteboard.co/HWp1hUb.jpg

Я попробовал функцию карты, но мой входящий поток данных из API представляет собой массив массивов, поэтому Я попытался объединить карту без какого-либо успеха (https://www.learnrxjs.io/operators/transformation/mergemap.html)

Я попытался с помощью оператора do() вызвать exportToFirebase(res.item), но, похоже, я здесь совершенно не в курсе: -P

Ожидаемый результат: Создать цикл для отправки параметра элемента типа Listing в мою сервисную функцию с именем exportToFirebase(res.item)

Вопросы

  1. Как добавить дополнительное свойство к каждому из этих элементов? например, res.items.inserted = new Date();?

  2. Как связать каждую из этих res.items с другой функцией, называемой exportToFirebase(res.item))?

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Если я правильно понял ваш вопрос и вы хотите добавить поле к каждому элементу в массиве результатов, а затем передать каждый из них по отдельности в функцию exportToFirebase (), тогда может пригодиться что-то подобное:

getByTag(tag:string) {
  return this.http.get(this.URL + '/get/listings/', { headers })
    .pipe(
      map((res: Listings) => res.items)
    )
    .subscribe(items => {
      items.forEach(i => {
        i.inserted = new Date();

        exportToFirebase(i);
      });
    });
}

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

0 голосов
/ 15 января 2019

mergeMap бесполезен в вашем случае, потому что он был создан для сглаживания наблюдаемых.

Так что map оператор должен делать всю работу.

getByTag(tag:string) {
  return this.http.get(this.URL + '/get/listings/', { headers })
    .pipe(
      map((res: Listings) => res.items),
      map((list: any[]) => {
        return list.map(sublist => sublist.map(item => {...item, inserted: new Date()}));
      })
    );
}

Обновление

Вы можете сгладить массив, используя reduce:

map((res: Listings) => res.items.reduce(((arr, list) => arr.concat(list), [])),

map((list: any[]) => {
  return list.map(item => {...item, inserted: new Date()});
})

Для цепочки вы можете использовать do / tap:

tap((list: any[]) => {
  list.forEach(item => {
    exportToFirebase(item)
  });
})

Таким образом, фактическое выполнение exportToFirebase на вашей стороне, IKD, какая сигнатура этой функции, если она возвращает Observable или что-то еще

...