我正在构建一个读取二进制文件(包括zip文件)的js库。Javascript:禁止“停止运行这个脚本?”,或者如何使用setTimeout?
因为没有对二进制数据数组的直接原生支持,所以当zip文件变大时,需要进行大量复制(详细信息请参考See my other question)。
这会导致“停止运行此脚本?”警报。现在,我知道如果有一个无限循环会发生这种情况,但在我的情况下,它不是一个无限循环。这不是程序中的错误。它只需要很长的时间。
我该如何抑制?
我正在构建一个读取二进制文件(包括zip文件)的js库。Javascript:禁止“停止运行这个脚本?”,或者如何使用setTimeout?
因为没有对二进制数据数组的直接原生支持,所以当zip文件变大时,需要进行大量复制(详细信息请参考See my other question)。
这会导致“停止运行此脚本?”警报。现在,我知道如果有一个无限循环会发生这种情况,但在我的情况下,它不是一个无限循环。这不是程序中的错误。它只需要很长的时间。
我该如何抑制?
我相信这个功能是特定于Firefox和/或其他浏览器的,并且它与javascript语言本身无关。
就我所知,你(程序员)无法在访问者的浏览器中停止它。
在IE中(也可能是Firefox),消息是基于执行的语句数量而不是运行时间。如果你可以将一些处理分解为一个单独的函数,并用setTimeout推迟它,我相信它不会计入极限。
此消息是为了安全原因启用,因为否则,您可以简单地阻止用户浏览器与一个简单的永无止境的循环。我认为没有办法停用它。
想想如何将您处理的内容分解为多个部分,并通过setTimeout
安排它们,但这应该抑制该消息,因为脚本现在不是一直运行。
谢谢,我知道*为什么*信息存在。我确实使用setTimeout()来解决问题。 – Cheeso 2009-12-18 03:44:45
...回答我自己的问题,所以我可以发布我使用的代码。
主要问题是,我正在用一个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"
});
为什么JavaScript读取ZIP文件? – SLaks 2009-12-18 01:06:56
为什么在Javascript中阅读zip文件?因为我可以。我想看看是否有可能,所以我正在构建它。我可以想象一些可能的应用。不知道这将是多么实际。目前,它工作,虽然对于一个145kb的文件,它需要几秒钟来解压缩/解压缩。 – Cheeso 2009-12-18 01:36:31