为什么我的XHR呼叫等待对方返回响应

我有一个页面内的iframe不断轮询服务器的会议variables,由主“XHR主动更新。

所以基本上:

  1. 主XHR运行并完成它的任务,在运行时更新会话variables。 通常需要一段时间,比如说10秒以上。

  2. 当主XHR正在运行时,我使用并行XHR请求轮询服务器以查找相同的会话variables。 我应该更新前端视图,每当我收到我的轮询XHRs的回应。

问题在于,轮询XHR在主XHR完成之前不会返回任何内容,当然这些内容已经无用了。 处理会话时,这真的是预期的行为吗? 像每个客户端连接有一个会话types的限制?

编辑:

这是一些代码片段。 代码是相当大的,所以我试图削减到最基本的要领。 这里可能有一些语法错误,因为我只是从源代码中拿出重要的部分。

生成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(或脚本结束)时释放会话文件。 同时尝试访问会话的其他脚本,等待发布。 一个详细的文章在这里或手动会话写关闭