【问题标题】:event is waiting for ajax call even though async set to true即使 async 设置为 true,事件仍在等待 ajax 调用
【发布时间】:2022-01-06 11:02:56
【问题描述】:

我试图让用户打开一个选项卡,以便在当前选项卡向服务器发出一些请求时继续让他使用系统。

所以我打开一个新标签并尝试使用$(window).load()$(window.document).ready() 在元素准备好时单击某些项目。使用大型服务器请求对其进行测试时,仅当 ajax 请求返回结果并完成成功功能时才加载窗口,即使它应该是异步的。 会喜欢一些想法为什么会发生。 g_SearchHandler.SearchPleaseWait(true); 正在调用用等待的 gif 覆盖屏幕并调用 displayNewTab() 打开一个新标签。

打开新标签的代码:

displayInNewTab: function(){
        try {
            var w = window.open(href = "/prod/php/home.php");
            var loadingFunc = function(){
                var devices = w.document.querySelector(`.sidebar-segment[data-segment-name="DEVICES"]`);
                var selDevice = getSelectedDeviceTreeData();
                if(!selDevice){
                    return;
                }
                var selDeviceObj = w.document.getElementById(selDevice.name);
                //when the window is loaded keep trying until elements are available for clicking.
                if(devices && selDeviceObj){
                    devices.click()
                    w.ClickOnItem(selDevice.name, false, true)
                }else{
                    setTimeout(loadingFunc,1000);
                }
            }
            $(w.document).ready(loadingFunc);
        }catch (e){
            console.error(e)
        }
    }

g_SearchHandler.SearchPleaseWait(true); ajax 请求:

$.ajax({
        type     : "POST",
        dataType : "json",
        url      : "commands.php",
        data     : params,
        success  : function(objJSON)
        {
            DisplayResults(objJSON);
            g_SearchHandler.SearchPleaseWait(false);
        }
});

【问题讨论】:

    标签: javascript ajax events


    【解决方案1】:

    显然是因为页面花了一些时间向服务器请求资源,所以服务器首先服务了ajax请求,页面资源的请求在队列中,在ajax请求完成后服务。

    一个快速的补丁是将ajax请求插入setTimeout(),这样新页面将首先请求资源,然后才会发送ajax请求。

    例如:

    setTimeout(function(){
        $.ajax({
            type     : "POST",
            dataType : "json",
            url      : "commands.php",
            data     : params,
            success  : function(objJSON)
            {
                DisplayResults(objJSON);
                g_SearchHandler.SearchPleaseWait(false);
            }
        })
    },5000);
    

    编辑

    当我意识到问题所在时,我已经检查了一些更好的解决方案。

    两个解决方案是:

    1.在打开标签之前获取页面资源,然后才发出ajax请求

    $.get("/prod/php/home.php")
        .done(function(){
            // open new tab with fetched resources.
            //make ajax call here.
        })
    
    1. 因为 php 会话被锁定,这就是导致问题的原因。在 php 服务器端 session_write_close(); 成功了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-02
      • 1970-01-01
      • 2017-09-15
      • 1970-01-01
      • 1970-01-01
      • 2020-11-25
      • 2019-08-14
      • 2020-11-19
      相关资源
      最近更新 更多