Javascript Dojo 1.10和XHR:未调用进度回调
我正在使用Dojo1.10将文件上载到服务器。对于上传,我使用模块dojo/request/xhr并尝试以百分比显示进度。我感到困惑的是,进程回调仅在传输结束时触发一次。文件已成功传输。请参阅我的代码片段:Javascript Dojo 1.10和XHR:未调用进度回调,javascript,dojo,xmlhttprequest,Javascript,Dojo,Xmlhttprequest,我正在使用Dojo1.10将文件上载到服务器。对于上传,我使用模块dojo/request/xhr并尝试以百分比显示进度。我感到困惑的是,进程回调仅在传输结束时触发一次。文件已成功传输。请参阅我的代码片段: function uploadFile(){ require([ 'dojo/dom', 'dojo/request/xhr' ], function(dom, xhr) { //... some unimportant code here // Up
function uploadFile(){
require([
'dojo/dom',
'dojo/request/xhr'
], function(dom, xhr) {
//... some unimportant code here
// Upload file now:
xhr(targetURL, {
handleAs: 'text',
method: 'POST',
headers: {'X-CSRF-Token': getAuthToken(), 'accept-charset': 'UTF-8'},
data: formData
}).then(function(data){
// Success => refresh file list
refreshDocList();
}, function(err){
// Failed
uploadFailed(err);
}, function(evt){
// Progress of upload
console.log(evt);
dom.byId('progress').innerHTML = 'Done ' + (evt.loaded * 100 / evt.total) + '%';
});
});
}
我在FireFox(45.0.1,Windows8.1)、Chrome(49.0.2623.110M,Windows8.1)、MSIE(11.0.9600.18231,Windows8.1)、FireFox(44.0,Ubuntu 15.04)、Chrome(48.0.2564.116,Ubuntu 15.04)中进行了测试。在上述浏览器中,进度回调都没有按预期调用。有没有解决我的问题的技巧?在dojo/request中似乎没有任何方法可以做到这一点。您需要直接使用XMLHttpRequest 原因是只为下载部分发出进度事件。对于上传部分,您需要使用XHR对象的上传成员,如下所示:
var oReq = new XMLHttpRequest();
oReq.upload.addEventListener("progress", updateProgress);
oReq.upload.addEventListener("load", transferComplete);
oReq.upload.addEventListener("error", transferFailed);
oReq.upload.addEventListener("abort", transferCanceled);
oReq.open();
看看dojo/request/xhr,我认为没有任何简单的方法可以让dojo/request/xhr公开xhr对象(并扩展上传成员)。因此,您可能需要直接使用XMLHttpRequest
有关更多信息,请参见@yassam的回答,似乎有一种方法可以访问
xhr
对象,该对象位于dojo/request
的幕后,但出于某种原因,我只能在将true
作为request()
的第三个参数传递给request()时才能使用它。。这是returnDeferred
参数,如果选中dojo/request/xhr
code,则最后一行是:
return returnDeferred ? dfd : dfd.promise;
因此,您可以这样做:
var promise = request('some_url', { .. options .. }, true); // <-- note 'true'!
if (promise.response.xhr) {
promise.response.xhr.upload.addEventListener("progress", function (e) {
console.log('xhr progress: ' + e.loaded + ' of ' + e.total + ': ', e);
});
}
var promise=request('some_url',{..options..},true);//你上传的文件有多大?是否进度事件没有时间触发?用于处理的Dojo代码如下:,如果您使用Dojo的源版本,您可以尝试添加调试信息。我已经用小文件和大文件(超过50MB)对其进行了测试。同样的行为。我去年编写的代码从未投入生产,现在我又面临这个问题。我同意您的看法,dojo/request
很好地将事件侦听器连接到“receiving”的XMLHttpRequest
对象,该对象处理来自服务器的响应,但不处理处理上载(来自浏览器的请求)的“upload”对象。另见。。我知道在调用send()之前必须附加事件侦听器,但是dojo/request/xhr
不允许这样做。你最终避免了dojo吗?