Операторы Angular Map и mergeMap rxjs6

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

Я пытаюсь экспортировать свои данные из 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 представляет собой массив массивов, поэтому я безуспешно попытался выполнить mergeMap (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))?


person Tbit    schedule 14.01.2019    source источник
comment
Итак, ваша проблема в том, что exportToFirebase(res.item) возвращает Observable?   -  person martin    schedule 15.01.2019


Ответы (2)


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()});
})

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

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

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

person Danil Gudz    schedule 15.01.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, как упоминалось в другом ответе, если вы не Не хочу использовать подписку.

person 8ytan    schedule 15.01.2019