Очистить рекурсивные наблюдаемые из предыдущих результатов - PullRequest
0 голосов
/ 06 ноября 2019

Я использую оператор expand для рекурсивного вызова предоставленной функции.

this.getPolyline().pipe(
  expand(({ polyline, same }) => same ? this.getPolyline(polyline) : empty()),
  tap(e => console.log(e))
).subscribe();

Нет необходимости объяснять все, что происходит внутри компонента, поэтому для упрощения скажем, что на каждом clickиспускает mapPmVertexAdded$ и mapPmSnap$ наблюдаемые.

private getPolyline(line?: L.Polyline): Observable<{polyline: L.Polyline, same: boolean}> {
  return this.leafletService.mapPmVertexAdded$.pipe(
  withLatestFrom(this.leafletService.mapPmSnap$),
  filter(([{ latlng }, { snapLatLng }]) => latlng.lng === snapLatLng.lng && latlng.lat === snapLatLng.lat),
  map(([vertex, { layerInteractedWith }]) => {
    const coords = layerInteractedWith._latlngs.map((latLngs: Array<L.LatLng>) => latLngs.map((latLng: L.LatLng) => [latLng.lat, latLng.lng]));
    coords[0].push(coords[0][0]);
    return L.polyline(coords);
  }),
  mergeMap((polyline: L.Polyline) => this.comparePolylines(line, polyline))
)}

Итак, вот что пришло мне в голову. Вывод после первый клик:

enter image description here

Вывод после второй клик:

enter image description here

Вывод после третий клик:

enter image description here

Кажется, что всепредыдущие результаты остались в потоке. Я хочу иметь только 1 элемент в потоке. Как я могу добиться этого поведения?

Ответы [ 2 ]

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

Я удалил условие в основной трубе

this.getPolyline().pipe(
  expand((polyline) => this.getPolyline(polyline)),
  tap(e => console.log(e))
).subscribe();

И использовал take(1) вместо first()

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

Не уверен, что если я правильно понимаю, добавление оператора first () может просто помешать отправке предыдущего потока в цикле

private getPolyline(line?: L.Polyline): Observable<{polyline: L.Polyline, same: boolean}> {
  return this.leafletService.mapPmVertexAdded$.pipe(
  withLatestFrom(this.leafletService.mapPmSnap$),
  filter(([{ latlng }, { snapLatLng }]) => latlng.lng === snapLatLng.lng && latlng.lat === snapLatLng.lat),
  map(([vertex, { layerInteractedWith }]) => {
    const coords = layerInteractedWith._latlngs.map((latLngs: Array<L.LatLng>) => latLngs.map((latLng: L.LatLng) => [latLng.lat, latLng.lng]));
    coords[0].push(coords[0][0]);
    return L.polyline(coords);
  }),
  mergeMap((polyline: L.Polyline) => this.comparePolylines(line, polyline)),
  first()
)}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...