1

ファイルのアップロードは完全に機能します。イベントprogessloadイベントをコールバックすることができません

WebWorker コードとして JavaScript ファイルに次のものがあります。

UploadFileWorker.js

function uploadFile(url, m) {
    var f = m.file;
    var fd = new FormData();
    fd.append('file', f, f.name);
    var xhr = new XMLHttpRequest();
    xhr.upload.addEventListener('progress', function (e) {
        m.set('status', (e.loaded / e.total) * 100 );
        postMessage(m); // <-- never makes the call, doesn't throw and error either
    });
    xhr.upload.addEventListener('load', function (e) {
        m.set('status',100);
        postMessage(m); // <-- never makes the call, doesn't throw and error either
    });
    xhr.open('POST', url, true);
    xhr.send(fd);
}

function getUploadURL(m) {
    var xhr = new XMLHttpRequest();
    xhr.addEventListener('load', function () {
        var url = this.responseText;
        uploadFile(url,m);
    });
    xhr.open('GET', '/upload', false);
    xhr.send();
}

var q = [];

onmessage = function(e) {
    postMessage(e.data);
    q.push(e.data);
    while (q.length > 0) {
        var m = q.pop();
        getUploadURL(m);
    }
};

postMessage(e.data);関数内は完全onmessageに機能します。

postMessage(m);コールバックはxhr.upload.addEventListeners()決して起こりません。これらの関数を試してWebWorkerコードに移動する前に、それらは正常に機能しました。

これは範囲の問題ですか? もしそうなら、どうすれば呼び出しを機能させるために呼び出しにプレフィックスを付けることができますか?

完全を期すために、インスタンスを定義して開始する方法を次に示しますWorker

onButtonClick: function(button, e, eOpts) {
    var ugv = this.getUploadGridView();
    var fs = this.getFileUploadStore();
    var worker = new Worker('/js/UploadFileWorker.js');
    worker.onmessage = function(e) {
        console.log(e);
    };

    var selected = ugv.getSelectionModel().getSelection();

    Ext.each(selected, function(m) {
        var o = {};
        o.name = m.get('name');
        o.size = m.get('size');
        o.status = m.get('status');
        o.file = m.file;
        worker.postMessage(o);
    });
},

postMessage();ここでも、ファイルの実際のアップロードはうまく機能しますが、コールバック内から呼び出す方法がわかりませんxhr

4

1 に答える 1

0

これは明らかに最近修正されたバグです。

問題71433002 : ワーカーの XHR アップロード進行状況イベントを有効にします。(閉まっている)

Chrome が更新されるまでの回避策

xhr.addEventListener(

それ以外の

xhr.upload.addEventListener(

これには、イベントが発生しないよりも小さいファイルprogressごとにのみ呼び出されるという欠点があります。1MB1MBprogress

于 2013-11-23T21:08:47.903 に答える