From 34fed74b797d3d97ce68b9943f79b220c5367e41 Mon Sep 17 00:00:00 2001 From: Hanzo_dev <2002samudiojohan@gmail.com> Date: Wed, 11 Mar 2026 10:55:18 -0500 Subject: [PATCH] fix: corregir race condition en cancelacion de tokens (polylines huerfanas) --- frontend/src/views/MapView.vue | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/frontend/src/views/MapView.vue b/frontend/src/views/MapView.vue index d341097..6a8eab1 100644 --- a/frontend/src/views/MapView.vue +++ b/frontend/src/views/MapView.vue @@ -272,7 +272,15 @@ async function initializeMap() { // MARKER RECYCLING & REACTIVITY OPTIMIZATION function clearMapMarkers() { + // Cancelar cualquier operación async en vuelo ANTES de limpiar el mapa. + // Sin esto, una llamada a encontrarParadaCercana que termine después del cleanup + // dibuja una polilínea huérfana que nunca se limpia. + currentCancelToken.cancelled = true; + currentCancelToken = { cancelled: false }; // token limpio para la próxima operación + isUpdatingMarkers.value = false; // liberar lock + limpiarTodoCentralizado(); + limpiarCaminata(); // garantizar que el ref de la polyline de caminata quede limpio // Limpiar también los marcadores de las unidades (buses) if (unitMarkers.value.size > 0) { @@ -299,7 +307,7 @@ function reDrawUserMarker() { } async function updateMapMarkers(skipZoom = false) { - if (!isLoaded.value || !map.value || isUpdatingMarkers.value) return; + if (!isLoaded.value || !map.value) return; const currentRequestRouteId = routeStore.selectedRouteId; if (!currentRequestRouteId) { @@ -307,7 +315,14 @@ async function updateMapMarkers(skipZoom = false) { return; } + // ── CANCELACIÓN EXPLÍCITA: invalidar la operación anterior en vuelo. + // Si NO se hace esto, el token viejo queda en cancelled=false y la + // encontrarParadaCercana anterior dibuja una polilínea huérfana al completarse. + currentCancelToken.cancelled = true; + isUpdatingMarkers.value = false; // liberar lock antes de crear el nuevo + // Capturar el token de generación ANTES de cualquier await + markerGenerationId.value++; const myGeneration = markerGenerationId.value; // Crear un token de cancelación para esta operación específica const myToken = { cancelled: false };