微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐