我在一个不断轮询服务器的页面中有一个iframe,它正在被一个“主”XHR主动更新的会话变量。为什么我的XHR呼叫等待对方返回响应
所以基本上:
主要XHR运行并做它的事情,更新会话变量,因为它运行。通常需要一段时间,比如10秒以上。
当主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;
}
}
}
请提供您用于制作和发送XHR的实际代码 - 无法从您的描述中了解发生了什么。 – Sacho 2014-11-24 09:56:53
如果您尝试通过两个异步调用更新和获取相同变量,则听起来像有某种竞争条件正在发生。 – Vidur 2014-11-24 10:07:17
@Sacho我添加了一些代码片段。 – turntwo 2014-11-24 11:55:46