1

リンクがクリックされたときに実行される JavaScript コードがいくつかあります。

そのコードが実行された後、アラートを表示したいのですが、以前のコードが完了する前にアラートが表示されています

document.querySelector('.btn-primary').addEventListener('click', function(evt) {

    var loops = 10;
    var chunkLength = Math.ceil(file.size / loops);
    var start = 0;
    var stop = chunkLength;

    for (var i = 0; i < loops; i++) {
        var blob = file.slice(start, stop);
        readText(blob);
        start = stop;
        stop += chunkLength;
    }
    alert('entire file loaded');
    print();
}, false);

アップデート

readText メソッドが進行状況バーを更新し、これはアラートがポップアップした後に発生するためです。これは ajax 呼び出しではなく、単なるローカル メソッド(非同期です...)

最終的に、アラートをファイルを保存するための呼び出しに置き換えようとしていますが、空のファイルを保存するだけなので、ファイルの内容がまだ生成されていない場合は役に立ちません。

4

2 に答える 2

1

readTextあなたはそれが非同期メソッドであると述べました。alertこれが、以前のショーのreadText実行が終了した理由です。forループは、呼び出しが終了していない時間まで、すべての反復を実行しますreadText。, の後に実行する次のステートメントforは、alert表示されているものです。

readTextコールバック関数を提供する場合は、それを使用する必要があります。

var counter = 0;
for (var i = 0; i < loops; i++) {
    var blob = file.slice(start, stop);
    readText(blob, function() {
        counter++;
        if(counter === loops) {
            alert("entire file loaded");
        }
    });
    start = stop;
    stop += chunkLength;
}

ただし、これは操作の順序を保証するものではありません。後の反復での呼び出しが、前の反復からの呼び出しの前に終了する可能性は十分にあります。

readTextにコールバック引数がなく、その関数のソースを変更できる場合は、次のようにする必要があります。

function readText(blob, callback) {
    ...

    if(typeof callback === "function") {
        callback();
    }
}
于 2013-11-08T22:34:28.453 に答える
1

その場合、readTextコールバック関数を受け入れるように拡張する必要があります。

function readText(blob, callback) {
    var reader = new FileReader();
    reader.onload = callback;
    // whatever else your function does to load the file
}

次に、次のように呼び出します。

readText(blob, function() {
    alert('entire file loaded');
});

もちろん、readTextそれ自体が非同期作業を別の場所に委任する場合は、そこにもコールバックを渡す必要があります。

実際の非同期関数がコールバック パラメーターを受け入れない場合は、呼び出し元に完全であることを通知する別の方法を確認する必要があります。イベントが発生する場合があります。readTextしかし、それは実際には実装方法に依存します。

于 2013-11-08T22:34:33.093 に答える