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 回答