A continuación se muestra mi archivo JS completo de principio a fin. Configuré una variable 'rendida' fuera de todas las funciones. Luego, dado que se requiere en la verificación de si justo antes de emitir una solicitud POST, quiero usarlo como indicador y actualizar su valor para que sea verdadero al finalizar la solicitud posterior. El problema es que todas las llamadas a console.log imprimen el valor modificado pero no persiste. Cuando nuevamente las coordenadas de posición se recuperan automáticamente en la función watchPosition, la función de cálculo de distancia se invoca nuevamente. Entonces, el valor guardado anterior con "window.rendered = true" no está allí, en realidad es falso y entra en la condición if. ¿Cómo puedo lograr el objetivo de no volver a emitir la solicitud de publicación hasta que otra solicitud de publicación cambie esta variable de indicador a falso?
var rendered = false; function myfunc() { rendered = true; console.log(window.rendered); } function updatePosition() { if(navigator.geolocation) { navigator.geolocation.watchPosition(calculateDistance); } else { console.log("Geolocation is not supported by this browser.") } } function calculateDistance(position) { var pos = new google.maps.LatLng(position.coords.latitude, position.coords.longitude); var target = new google.maps.LatLng(55.85365783555865, -4.288739944549508); var dis = google.maps.geometry.spherical.computeDistanceBetween(pos, target); console.log(window.rendered); var self = this; if(dis <= 1000 && dis >= 0 && window.rendered == false) { console.log("Distance"+dis); var url = '/dogpark/near_park/'; var csrftoken = getCookie('csrftoken'); $.ajax({ url: url, type: "POST", data: { csrfmiddlewaretoken: csrftoken, in_proximity : 1 }, async: false, success: function(data) { myfunc(); self.rendered = true; window.rendered = true; alert(window.rendered); window.location = '/dogpark/near_park/'; }, complete: function(data) { console.log("Trying"); window.rendered = true; alert(window.rendered); }, error: function(xhr, errmsg, err) { console.log(xhr.status+": "+xhr.responseText); }, }); } window.onload = updatePosition()Una forma simple es usar otra variable para rastrear la finalización de la llamada ajax. Para que no realice otra llamada Ajax hasta que la anterior devuelva una respuesta (éxito/fracaso).
var isWaitingForResponse = false; ... function calculateDistance(position) { ... if(dis <= 1000 && dis >= 0 && window.rendered == false && !isWaitingForResponse) { isWaitingForResponse = true; ... success: function(data) { isWaitingForResponse = false ... }, complete: function(data) { isWaitingForResponse = false ... }, error: function(xhr, errmsg, err) { isWaitingForResponse = false ... } ...