Dojo 1.10和XHR:未调用进程回调

时间:2016-04-04 13:14:18

标签: javascript dojo xmlhttprequest

我使用Dojo 1.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,Windows 8.1),Chrome(49.0.2623.110 m,Windows 8.1),MSIE(11.0.9600.18231,Windows 8.1),FireFox(44.0,Ubuntu 15.04),Chrome(48.0。 2564.116,Ubuntu 15.04)。在所提到的浏览器中,没有按预期调用进程回调。任何提示如何解决我的问题?

2 个答案:

答案 0 :(得分:1)

在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 source code,我不认为有任何简单的方法可以获得dojo / request / xhr来公开XHR对象(并且通过扩展< strong>上传成员)。因此,您可能需要直接使用XMLHttpRequest。

有关详情,请参阅https://developer.mozilla.org/en/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest

答案 1 :(得分:0)

在@yassam的答案之后,似乎有一种方法可以访问xhr幕后的dojo/request对象,但是由于某些原因,我只能在通过时才能使它起作用true作为request()的第三个参数。这是returnDeferred参数,如果您检查dojo/request/xhr代码,则其最后一行:

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);
    });
}

我目前不了解的一件事,将false传递给returnDeferred(或省略)应该返回dfd,而不是dfd.promise的{​​{1}} ,在这种情况下,您应该能够以完全相同的方式使用request(),但我发现这并不存在。