当前位置: 首页 > 面试题库 >

为什么我的XHR呼叫彼此等待返回响应

高山
2023-03-14
问题内容

我在一个页面内有一个iframe,该页面正在不断地轮询服务器以获取正在由“主要” XHR主动更新的会话变量。

所以基本上:

  1. 主XHR运行并完成其任务,并在运行时更新会话变量。通常需要一段时间,例如超过10秒。

  2. 当主要XHR运行时,我使用并行XHR请求在服务器上轮询相同的会话变量。每当我收到来自轮询XHR的响应时,就应该更新前端视图。

问题在于,轮询XHR直到主XHR完成后才返回任何内容,这时它们已经毫无用处了。在处理会话时,这真的是预期的行为吗?像每个客户端连接一个会话之类的限制?

编辑:

这是一些代码片段。代码很大,因此我尝试将其精简为基本要素。当我只是从源代码中取出重要部分时,可能在此处键入某些语法错误。

生成iframe

(function($) {
    $(document).on('click','#proceed_form',function(){
        $('#upload_frame').show(); 
        function set () { 
            $('#upload_frame').attr('src','/productUpload/generateIframe'); 
        }
        setTimeout(set); 
    });
});

iframe

<script type='text/javascript' src="/assets/js/src/vendor/jquery-1.9.1.js" ></script>

<script>

(function($) {

    $(document).ready(function() { 
        setInterval(function() 
        {
            $.get("/productController/getProgress", function(data)
            {
                $('#progress_container').fadeIn(100);   //fade in progress bar  
                $('#progress_bar').width(data +"%");    //set width of progress bar based on the $status value (set at the top of this page)
                $('#progress_completed').html(parseInt(data) +"%"); //display the % completed within the progress bar
            }
        )},500);

    });

})(jQuery);

</script>


<div id="progress_container">
    <div id="progress_bar">
         <div id="progress_completed"></div>
    </div>
</div>

PHP应用

class productUpload extends CI_Controller{

    /**
     * Respond to XHR poll request
     *
     */
    public function getUploadedBytesToCloud()
    {
        session_start();
        $uploadedBytes = $_SESSION['bytes_uploaded'];
        echo json_encode(['uploadedBytes' => $uploadedBytes]);
    }

    /**
     * Main controller action
     * Uploads the images of a product to the cloud
     *
     */ 
     public function moveProductImagesToCloud($productId)
     {
          /**
           * Some logic to get the product image directory
           *
           */
           $productPath = '/assets/product/image_dir';
           $directoryMap = directory_map($productPath);
           foreach($directoryMap as $key => $file){
                 /**
                  * Upload file to AWS S3 bucket
                  */ 
                 $this->awsUploader->uploadFile(...);

                 $fileSize = $_SESSION['bytes_uploaded'];
                 $fileSize += filesize(getcwd()."/".$productPath."/".$file);
                 $_SESSION['bytes_uploaded'] = fileSize;
            }
      }

}

问题答案:

是的,默认会话管理器(使用文件)在执行session_start时锁定会话文件,在执行session_write_close(或脚本结束)时释放会话文件。同时,其他尝试访问会话的脚本等待发布。此处或在手动session-write-
close上
有详细的文章



 类似资料:
  • 问题内容: 方案:修改并保存对广告系列的不完整更改 关键是,最后一步中的“错误提示框”是一个ajax调用,它将根据操作成功而带来一个绿色或红色提示框。目前,我要做的是在“然后按保存…”之后,我将进行一次sleep(3),以使其有时间显示此气球。您浪费时间似乎不太明智,也因为在某些时候处理此调用可能花费更多或更少的时间。 你们如何让Behat测试等待Ajax完成,而不仅仅是让野兽入睡? 非常感谢您的

  • 问题内容: 似乎以下代码应返回true,但返回false。 这有什么意义? 问题答案: 常规()和严格()相等之间的唯一区别是,严格相等运算符禁用类型转换。由于已经在比较两个相同类型的变量,因此使用的相等运算符的类型无关紧要。 不管您使用常规相等还是严格相等,对象比较仅 在您比较相同的精确对象时得出 。 也就是说,给定,,,但。 两个不同的对象(即使它们都具有零或相同的精确属性)也永远不会相等地进

  • 问题内容: 现在很清楚什么是元类,有一个相关的概念我一直都在使用,而并不知道它的真正含义。 我想每个人都在括号里犯了一个错误,导致了“对象不可调用”异常。而且,使用并导致怀疑这种血腥的用途。 您能给我一些解释,包括魔术方法的例子吗? 问题答案: 可调用对象是可以调用的任何东西。 所述内置的可调用()检查该参数可以是: 具有方法的类的实例或 是具有非成员的类型,该成员以其他方式指示可调用性(例如在函

  • 据我所知,Twilio处理呼叫转移的方式和telcom运营商的方式是有区别的。 在第一种情况下,对于标准运营商转发,假设A呼叫B,如果B不应答(有条件呼叫转发),或者他们设置为总是转发(无条件呼叫转发),呼叫将被转发给C。换句话说,呼叫从红线路由到紫色。这是在运营商方面完成的(B的电话甚至不需要打开就可以工作)。 但是,在Twilio的情况下,如果A已经在与Twilio(紫色路径)对话,并且应用程

  • 问题内容: 如果浏览器收到对ajax请求的重定向响应,该怎么办? 问题答案: 如果浏览器收到对ajax请求的重定向响应,该怎么办? 如果服务器发送了重定向(又名302响应加上Location:标头),则浏览器将自动跟随重定向。对 第二个 请求的响应(假设它也不是另一个重定向)是程序所暴露的。 实际上,您没有能力检测是否已发生302响应。如果302重定向导致200,则您的程序的行为就如同原始请求直接