Как использовать FileSystem API для отладки Javascript? Выпуск исполнительного приказа - PullRequest
2 голосов
/ 22 сентября 2011

Я отлаживал сложную программу, написанную на 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

могу ли я включить функцию "onInitFun ()", которая называется более ранней, чем "MyFun ()". Или Где я должен поставить "MyFun ()", чтобы он мог быть вызван позже, чем "OnInitFun ()". Я не хочу, чтобы пользователь нажимал одну кнопку, так как MyFun просто выполняет предварительную обработку при загрузке. Могу ли я сгенерировать одно сообщение, поэтому «MyFun ()» будет вызван позже, чем «onInitFs ()»?

1 Ответ

1 голос
/ 22 сентября 2011

Должен сработать либо комментарий Андрея, либо следующее:

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

Как я понимаю, fs api специально разработан, чтобы быть асинхронным. Таким образом, вы не можете заставить его вызываться в любом порядке. Таким образом, вам придется приспособиться к асинхронному мышлению, а не к синхронному мышлению.

Если вы хотите, чтобы MyFun вызывался при выполнении запроса файловой системы, то перехват MyFun запускается при выполнении запроса файловой системы (а не к другому событию, не относящемуся к onBodyLoad):

...