小编典典

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

ajax

我在一个页面内有一个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;
            }
      }

}

阅读 317

收藏
2020-07-26

共1个答案

小编典典

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

2020-07-26