分享

Javascript-为什么我的XHR呼叫互相等待以返回响应

 印度阿三17 2019-10-14

我在一个页面内有一个iframe,该iframe不断地轮询服务器以获取正在由“主要” 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;
            }
      }

}

解决方法:

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多