fix: corregir race condition en cancelacion de tokens (polylines huerfanas)

This commit is contained in:
2026-03-11 10:55:18 -05:00
parent 3e77676e20
commit 34fed74b79

View File

@ -272,7 +272,15 @@ async function initializeMap() {
// MARKER RECYCLING & REACTIVITY OPTIMIZATION // MARKER RECYCLING & REACTIVITY OPTIMIZATION
function clearMapMarkers() { 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(); limpiarTodoCentralizado();
limpiarCaminata(); // garantizar que el ref de la polyline de caminata quede limpio
// Limpiar también los marcadores de las unidades (buses) // Limpiar también los marcadores de las unidades (buses)
if (unitMarkers.value.size > 0) { if (unitMarkers.value.size > 0) {
@ -299,7 +307,7 @@ function reDrawUserMarker() {
} }
async function updateMapMarkers(skipZoom = false) { async function updateMapMarkers(skipZoom = false) {
if (!isLoaded.value || !map.value || isUpdatingMarkers.value) return; if (!isLoaded.value || !map.value) return;
const currentRequestRouteId = routeStore.selectedRouteId; const currentRequestRouteId = routeStore.selectedRouteId;
if (!currentRequestRouteId) { if (!currentRequestRouteId) {
@ -307,7 +315,14 @@ async function updateMapMarkers(skipZoom = false) {
return; 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 // Capturar el token de generación ANTES de cualquier await
markerGenerationId.value++;
const myGeneration = markerGenerationId.value; const myGeneration = markerGenerationId.value;
// Crear un token de cancelación para esta operación específica // Crear un token de cancelación para esta operación específica
const myToken = { cancelled: false }; const myToken = { cancelled: false };