我正在构建一个读取二进制文件的js库,包括zip文件。
因为对二进制数据数组没有直接的本机支持,所以当zip文件变大时,必须进行大量复制(See my other question以获取详细信息)。
这导致“停止运行此脚本?”警报。现在,我知道如果存在无限循环会发生这种情况,但在我的情况下,它不是无限循环。这不是程序中的错误。它只需要一个loooooong时间。
我该如何压制这个?
答案 0 :(得分:4)
此消息是出于安全原因启用的,因为否则您只需使用简单的永不停止循环来阻止用户浏览器。我认为无法停用它。
考虑将处理拆分为serval部分,并通过setTimeout
安排它们,这应该压制消息,因为脚本现在不是一直在运行。
答案 1 :(得分:3)
您可以将流程划分为增量,然后使用setTimeout
添加一个小延迟。
答案 2 :(得分:2)
在IE(也可能是Firefox)中,消息基于执行的语句数量,而不是运行时间。如果你可以将一些处理拆分成一个单独的函数,并用setTimeout推迟它,我相信它不会计入限制。
答案 3 :(得分:2)
...回答我自己的问题,所以我可以发布我用过的代码。
主要问题是,我正在使用readToEnd()方法读取文件的全部内容,该方法实际上一次读取一个字节。在阅读大文件时,花了很长时间。解决方案是异步读取,并分批读取。
这是我使用的代码:
readToEndAsync : function(callback) {
_state = "";
var slarge = "";
var s = "";
var txtrdr = this;
var readBatchAsync = function() {
var c = 0;
var ch = txtrdr.readChar();
while(ch != null)
{
s += ch;c++;
if(c > 1024)
{
slarge += s;
s = "";
break;
}
ch = txtrdr.readChar();
}
if (ch!=null){
setTimeout(readBatchAsync, 2);
}
else {
callback(slarge+s);
}
};
// kickoff
readBatchAsync();
return null;
},
并称之为:
textReader.readToEndAsync(function(out){
say("The callback is complete");
// the content is in "out"
});
答案 4 :(得分:0)
我相信此功能特定于Firefox和/或其他浏览器,它与javascript语言本身无关。
据我所知,你(程序员)无法在访问者的浏览器中停止它。