2

我正在调试一个用 Javascript 编写的复杂程序。我需要观察一个大矩阵的变化。使用 Chrome Inspect Element 查看矩阵中的每个元素并不方便。所以,我想将数据写入文本文件。我找到了 FileSystem API 和终端。

我已经将 FileSystem API 集成到我的项目中,参考 FileSystem 终端项目。我定义了一个全局变量来存储 fs.root 。我想要的是在调试时将此变量传递给我的程序,这样我就可以使用这个 fs.root 将数据转储到文本文件中。我请求文件系统:

 window.requestFileSystem(window.TEMPORARY, 5*1024*1024, onInitFs, errorHandler); // 5MB

但是“onInitFs”函数似乎是一个消息响应函数,调用得很晚。即使在“onLoad='MyFun();'”之后。所以,我不知道把我自己的函数放在哪里,以确保定义了变量“fs.root”。现在,我把“MyFun()”放到了任何地方,都会产生一个“fs.root”没有定义的错误,因为“onInitFs”函数没有被调用。我已经测试了调用顺序:

-------------main.html

<html>
      <header>
            <script type='text/javascript' src='MyFun.js'></script>
            <script type='text/javascript' >
                   console.log('01Position');

                   function onInitFs(fs)
                   {
                        aGlobalFsRoot = fs.root;
                        console.log('04Position');
                   }
          window.requestFileSystem(window.TEMPORARY, 5*1024*1024, onInitFs, errorHandler);
            </script>
      </header>
      <body onLoad="MyFun();">
            <script>
                   console.log('02Position');
            </script>
      </body>
</html>

-------------MyFun.js

var aGlobalFsRoot;
function MyFun()
{
    console.log('03Position');
    // want to use "aGlobalFsRoot" to dump some matrix data, but it is not defined, which means "onInitFs()" is still not called.
}

所以,在 Chrome Inspect Element 的控制台窗口中: 01Position 02Position 03Position 04Position

我可以启用比“MyFun()”更早的“onInitFun()”函数吗?或者我应该把“MyFun()”放在哪里,所以它可以在“onInitFun()”之后调用。我不希望用户单击一个按钮,因为 MyFun 只是在加载时进行预处理工作。我可以生成一条消息,所以“MyFun()”会比“onInitFs()”更晚被调用吗?

4

1 回答 1

1

安德烈的评论或以下评论都应该有效:

window.requestFileSystem(window.TEMPORARY, 5*1024*1024, function(fs) {onInitFs(fs); MyFun(fs); } , errorHandler);

据我了解, fs api 是故意设计为异步的。所以你不能强迫它以任何顺序被调用。因此,您必须适应异步思维方式而不是同步思维方式。

如果您想MyFun在文件系统请求完成时被调用,则挂钩MyFun以在文件系统请求完成时运行(而不是其他不相关的onBodyLoad事件):

于 2011-09-22T05:50:11.480 回答