全局变量更新 AJAX POST

Posted

技术标签:

【中文标题】全局变量更新 AJAX POST【英文标题】:Global variable update AJAX POST 【发布时间】:2022-01-04 22:05:56 【问题描述】:

下面是我从头到尾的完整 JS 文件。我在所有函数之外设置了一个“渲染”变量。然后,由于在发出 POST 请求之前的 if 检查中需要它,因此我想将其用作标志并在发布请求完成后将其值更新为 true。问题是所有 console.log 调用都会打印更改的值,但它不会持续存在。当再次在 watchPosition 函数中自动获取位置坐标时,再次调用 calculateDistance 函数。然后,之前保存的“window.rendered = true”的值就不存在了,它实际上是假的,它进入了if条件。如何实现在另一个 post 请求将此标志变量更改回 false 之前不再发出 post 请求的目标?

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()

【问题讨论】:

问题可能是网络调用不同步。 calculateDistance 在它完成之前被调用,这可能会一遍又一遍地发生。 如何解决? 【参考方案1】:

一种简单的方法是使用另一个变量来跟踪 ajax 调用完成情况。这样您就不会进行另一个 Ajax 调用,直到前一个返回响应(成功/失败)。

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
        ...
      
...

【讨论】:

以上是关于全局变量更新 AJAX POST的主要内容,如果未能解决你的问题,请参考以下文章

js设置全局变量ajax中赋值

ajax中如何使用全局变量?

用mui.ajax从后台获取到的data怎么赋值给全局变量

如何全局访问 AJAX 定义的变量? [复制]

ajax返回值传给js全局变量

如何在 PHP Symfony 4 中获取 POST 全局变量?