fix: corregir race condition en cancelacion de tokens (polylines huerfanas)
This commit is contained in:
@ -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 };
|
||||||
|
|||||||
Reference in New Issue
Block a user