2009-12-18 25 views
2

我正在构建一个读取二进制文件(包括zip文件)的js库。Javascript:禁止“停止运行这个脚本?”,或者如何使用setTimeout?

因为没有对二进制数据数组的直接原生支持,所以当zip文件变大时,需要进行大量复制(详细信息请参考See my other question)。

这会导致“停止运行此脚本?”警报。现在,我知道如果有一个无限循环会发生这种情况,但在我的情况下,它不是一个无限循环。这不是程序中的错误。它只需要很长的时间。

我该如何抑制?

+1

为什么JavaScript读取ZIP文件? – SLaks 2009-12-18 01:06:56

+2

为什么在Javascript中阅读zip文件?因为我可以。我想看看是否有可能,所以我正在构建它。我可以想象一些可能的应用。不知道这将是多么实际。目前,它工作,虽然对于一个145kb的文件,它需要几秒钟来解压缩/解压缩。 – Cheeso 2009-12-18 01:36:31

回答

3

您可以将进程分成增量,然后使用setTimeout添加一个小延迟。

+4

延迟不是必须的 - 即使超时为零也将允许返回事件循环,并应重置警告。 – s4y 2009-12-18 01:22:49

+0

工作完美,谢谢! – Cheeso 2009-12-18 03:17:17

0

我相信这个功能是特定于Firefox和/或其他浏览器的,并且它与javascript语言本身无关。

就我所知,你(程序员)无法在访问者的浏览器中停止它。

2

在IE中(也可能是Firefox),消息是基于执行的语句数量而不是运行时间。如果你可以将一些处理分解为一个单独的函数,并用setTimeout推迟它,我相信它不会计入极限。

4

此消息是为了安全原因启用,因为否则,您可以简单地阻止用户浏览器与一个简单的永无止境的循环。我认为没有办法停用它。

想想如何将您处理的内容分解为多个部分,并通过setTimeout安排它们,但这应该抑制该消息,因为脚本现在不是一直运行。

+0

谢谢,我知道*为什么*信息存在。我确实使用setTimeout()来解决问题。 – Cheeso 2009-12-18 03:44:45

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" 
});