Я использую оператор 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))
)}
Итак, вот что пришло мне в голову. Вывод после первый клик:
Вывод после второй клик:
Вывод после третий клик:
Кажется, что всепредыдущие результаты остались в потоке. Я хочу иметь только 1 элемент в потоке. Как я могу добиться этого поведения?