Javascript 获取AJAX调用的进度,以便在Rails中获取JSON

Javascript 获取AJAX调用的进度,以便在Rails中获取JSON,javascript,jquery,ruby-on-rails,json,ajax,Javascript,Jquery,Ruby On Rails,Json,Ajax,我使用以下JS从Rails应用程序中的控制器方法检索一些JSON数据: $.ajax({ xhr: function() { var xhr = $.ajaxSettings.xhr(); xhr.onprogress = function(e) { if (e.lengthComputable) { console.log(e.loaded / e.total); }

我使用以下JS从Rails应用程序中的控制器方法检索一些JSON数据:

$.ajax({
    xhr: function() {
        var xhr = $.ajaxSettings.xhr();
        xhr.onprogress = function(e) {
            if (e.lengthComputable) {
                console.log(e.loaded / e.total);
            }
        };
        xhr.upload.onprogress = function(e) {
            if (e.lengthComputable) {
                console.log(e.loaded / e.total);
            }
        };
        return xhr;
    },
    cache: false,
    url: '/get_data',
    method: 'GET',
    dataType: 'JSON',
    success: function(data) {
        console.log(data);
    }
});
方法如下:

def get_data
  @data = [{....}]
  respond_to do |format|
    format.html
    format.json do
      response.headers['Content-Length'] = @data.to_s.length.to_s
      render json: @data
    end
  end
end
由于
@data
太大或首先需要复杂的计算,返回该方法可能需要3-4秒,因此我想在AJAX运行时显示一个进度条

注意:我不只是想显示一个在AJAX前后显示的加载程序,而是实际显示进度

然而,我发现
lengthComputeable
总是错误的

如何让Rails发回正确的进度?我添加了
内容长度
标题,但它从未显示在响应中

ProgressEvent.LengthComputeable只读属性是一个布尔标志,指示ProgressEvent所涉及的资源是否具有可计算的长度


这意味着它需要一个
内容长度
标题。。。要知道资源有多大。您可能要做的是发送一个大小未知的应用程序八位字节流

使用jQuery知道请求何时完成

$(document).on({
    ajaxStart: function(){
        //show or create the progress bar
    },
    ajaxStop: function(){
        //hide or remove the progress bar
    }    
});

我错了。这不是一个真正的进度条,但其想法是:

$(函数(){
var pg=0;
函数progressbarAdd(){
pg++;
$('#bar').progressbar('option','value',pg.).children('ui progressbar value').css('display','block');
}
$('#bar').progressbar({value:0});
$(文件)({
ajaxStart:function(){
计时器=设置间隔(函数(){
progressbarAdd()
}, 100);
},
ajaxStop:function(){
清除超时(计时器);
$('#bar').progressbar('option','value',100);
}    
});
$.ajax({
方法:“GET”,
网址:'https://viacep.com.br/ws/01001000/json/',
数据类型:“json”,
成功:函数(){
log('JSON:',参数[0]);
},
错误:函数(){
console.log('Fail');
}
});
});


我有两个问题:1.)在请求完成之前,JS如何知道内容长度。。因为你只有在得到完整的回复后才能得到这个。2.)我如何让rails将此发送回?不正确。当它开始下载资源时,您首先获得头。xhr有5个阶段:0个未设置,1个打开,2个接收头,3个加载,4个DONESorry,但我对Railson一无所知。数据通常很小,下载只需一秒钟,因此计算下载的长度/字节可能没有意义。您可能遇到的是一个缓慢的后端,客户端在请求和响应之间处于空闲状态,服务器必须从数据库中获取某些内容。所以你可以给客户看一个旋转器,直到它完成。是这样的吗
response.headers['Content-Length']=1000
尽管它是伪造的,但效果非常好。除非我能让Rails返回真正的进度,否则我将暂时使用它。谢谢+1.