2016-11-18 1 views
2

Ich versuche zu vorrendern eine Mathjax HTML-Datei PhantomJS verwenden. Zum Beispiel in math.html nehme an, ich habe:Wie kann ich PhantomJS zwingen zu warten, bis MathJax fertig ist?

<!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> 

My (gebrochen) machen Skript sieht derzeit wie:

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

Ich habe versucht, die Seite zu Standard zu schreiben und Ausfahrt after die Der MathJax-Render-Befehl wird aus der Warteschlange aufgerufen. Aber es scheint, ich bin im Kontext der "Seite" und nicht im Phantom-Kontext der obersten Ebene. Die Variable page kann nicht gefunden werden: ReferenceError: Can't find variable: page.

Es hack ich in einem setTimeout statt, die die Flagge mit:

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

dann habe ich die gewünschte Ausgabe zu erhalten, aber natürlich die Wartezeit 10000 ms nach dem Inhalt ab.

Wie kann ich lassen PhantomJS wissen, dass Mathjax getan wird Rendering?

Ist das ein Sandbox-Problem?

+1

JavaScript single-threaded ist. Sie können eine Endlosschleife mit einem asynchronen Ereignis nicht stoppen, da das Ereignis blockiert wird, bis der Thread verfügbar ist. – 4castle

+0

Ah, las ich die Antworten auf diese zu schnell: http://stackoverflow.com/a/22125915/148668 –

+1

Genau, also eher als ein Flag in der Callback-Einstellung, setzen Sie die Anweisungen, die Sie in der Callback ausgeführt werden soll. – 4castle

Antwort

1

Versuchen Sie Folgendes:

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], 
     function() { 
     console.log(page.content); 
     phantom.exit(); 
     } 
    ); 
    }); 
}); 

Dies wird die Konsolenausgabe und phantom.exit() Anrufe Warteschlange sofort auftreten, nachdem der Satz auftritt. Ich habe den Code nicht getestet, aber das ist der Weg, um etwas mit dem MathJax-Prozess zu synchronisieren.


UPDATE

Try this:

var page = require('webpage').create(); 
var system = require('system');               
var fs = require('fs'); 
page.open(system.args[1], function() { 
    page.onAlert = function (msg) { 
    if (msg === "MathJax Done") { 
     console.log(page.content); 
    } else if (msg === "MathJax Timeout") { 
     console.log("Timed out waiting for MathJax"); 
    } else {console.log(msg)} 
    phantom.exit(); 
    }; 
    page.evaluate(function() { 
    MathJax.Hub.Queue(
     ["Typeset",MathJax.Hub], 
     [alert,'MathJax Done'] 
    ); 
    setTimeout(function() {alert("MathJax Timeout")},10000); // timeout after 10 seconds 
    }); 
}); 
+0

Scheint so, als würde die Sandbox dies vereiteln. Ich bekomme 'ReferenceError: Variable nicht gefunden: Seite'. –

+0

Ich habe meine Antwort mit einer neuen Version aktualisiert, um es zu versuchen. Sie könnten sich auch [code I provided] (https://groups.google.com/forum/#!msg/mathjax-users/nQXVaFi4IKQ/AwZ-UrRhiDAJ) vor Jahren ansehen, um eine SVG von MathJax über phantom.js zu erzeugen (das wurde inzwischen von mathjax-node abgelöst, wie Peter vorgeschlagen hat. Ich habe den Code oben aus dem früheren Codebeispiel gelesen. –

+0

Der aktualisierte Code funktioniert. Das ist eine ziemliche Problemumgehung, ich hätte nicht gedacht, auf diese Weise Alarm zu geben. –

Verwandte Themen