Как использовать FileSystem API для отладки Javascript? Выпуск распоряжения
Я отлаживал сложную программу, написанную на 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() с именем ealier чем MyFun (). Или Где я должен поставить "MyFun()", чтобы он мог быть вызван позже, чем "OnInitFun()". Я не хочу, чтобы пользователь нажимал одну кнопку, поскольку MyFun просто выполняет предварительную обработку при загрузке. Могу ли я сгенерировать одно сообщение, поэтому "MyFun()" будет вызываться позже, чем "onInitFs()"?
1 ответ
Либо комментарий Андрея, либо следующее должно сработать:
window.requestFileSystem(window.TEMPORARY, 5*1024*1024, function(fs) {onInitFs(fs); MyFun(fs); } , errorHandler);
Как я понимаю, fs api специально разработан, чтобы быть асинхронным. Таким образом, вы не можете заставить его вызываться в любом порядке. Таким образом, вам придется приспособиться к асинхронному мышлению, а не к синхронному мышлению.
Если ты хочешь MyFun
вызываться, когда запрос файловой системы выполнен, затем перехватить MyFun
запускаться после выполнения запроса файловой системы (а не к другому, не относящемуся к onBodyLoad
событие):