Я пытаюсь сделать pre-render a MathJax html file using PhantomJS. Например, предположим, что в math.html
у меня есть:Как заставить PhantomJS ждать окончания MathJax?
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="MathJax/MathJax.js"></script>
<script src="ConfigMathJax.js"></script>
</head>
<body>
<span class="math">\(e = m c^2\)</span>
</body>
</html>
Мой (прерывистая) делают сценарий в настоящее время выглядит следующим образом:
var page = require('webpage').create();
var system = require('system');
var fs = require('fs');
page.open(system.args[1], function() {
page.evaluate(function(){
var flag = false;
MathJax.Hub.Queue(["Typeset",MathJax.Hub]);
MathJax.Hub.Queue(function(){
console.log(page.content);
phantom.exit();
});
});
});
Я попытался написать страницу на стандартный вывод и выход after Команда MathJax render вызывается из очереди. Но похоже, что я в контексте «страницы», а не в контексте фантома верхнего уровня. Переменная page
не может быть найдена: ReferenceError: Can't find variable: page
.
Это я взломать в setTimeout
вместо использования флага:
var page = require('webpage').create();
var system = require('system');
var fs = require('fs');
page.open(system.args[1], function() {
page.evaluate(function(){
MathJax.Hub.Queue(["Typeset",MathJax.Hub]);
});
setTimeout(function(){
console.log(page.content);
phantom.exit();
},10000);
});
тогда я получаю желаемый результат, но, конечно, время ожидания 10000
мс будет зависеть от содержания.
Как я могу сообщить PhantomJS, что MathJax сделан рендеринг?
Это проблема с песочницей?
JavaScript является однопоточных. Вы не можете остановить бесконечный цикл с асинхронным событием, потому что событие блокируется до тех пор, пока поток не будет доступен. – 4castle
Ах, я быстро прочитал ответы об этом: http://stackoverflow.com/a/22125915/148668 –
Точно так, вместо того, чтобы устанавливать флаг в обратном вызове, поместите операторы, которые вы хотите выполнить в обратном вызове. – 4castle