Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Dojo 1.10和XHR:未调用进度回调_Javascript_Dojo_Xmlhttprequest - Fatal编程技术网

Javascript Dojo 1.10和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

我正在使用Dojo1.10将文件上载到服务器。对于上传,我使用模块dojo/request/xhr并尝试以百分比显示进度。我感到困惑的是,进程回调仅在传输结束时触发一次。文件已成功传输。请参阅我的代码片段:

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吗?