2016-11-18 11 views
2

私はを事前レンダリングしようとしています PhantomJSを使用しているMathJax htmlファイル。MathJaxが終了するまでPhantomJSを強制的に待機させることはできますか?

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

マイ(壊れた)スクリプトは、現在のように見えるレンダリング::私はは標準出力して終了afterにページを書くためにをしようとしました

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

例えば、私が持っているmath.htmlに仮定キューからMathJaxレンダーコマンドが呼び出されます。しかし、私は、トップレベルのファントムのコンテキストではなく、「ページ」のコンテキストにいるようです。変数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 MSはコンテンツによって異なります待ち時間を所望の出力を得るが、。

MathJaxがレンダリングされたことをPhantomJSに知らせるにはどうすればよいですか?

これはサンドボックスの問題ですか?

+1

JavaScriptがシングルスレッドです。スレッドが使用可能になるまでイベントがブロックされるため、非同期イベントで無限ループを停止することはできません。 – 4castle

+0

ああ、私はこれについての回答をあまりにも早く読んでいます:http://stackoverflow.com/a/22125915/148668 –

+1

正確には、コールバックにフラグを設定するのではなく、実行したいステートメントをコールバックに入れてください。 – 4castle

答えて

1

は、以下のことを試してみてください。

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

これは、組版が発生した直後に発生し、コンソール出力とphantom.exit()のコールをキューに入れます。私はコードをテストしていませんが、これはMathJaxのプロセスと何かを同期させる方法です。


UPDATE

はこれを試してみてください:

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

サンドボックスのように見えます。私は 'ReferenceError:変数を見つけることができません:page'を取得します。 –

+0

試しに新しいバージョンで自分の回答を更新しました。また、MathJaxからphantom.js経由でSVGを作成した場合、[コードを提供しました](https://groups.google.com/forum/#!msg/mathjax-users/nQXVaFi4IKQ/AwZ-UrRhiDAJ)以来、Peterが提案したように、mathjax-nodeに取って代わられています)。私は前のコード例から上のコードを引用しました。 –

+0

更新されたコードが機能します。それはかなり回避策です、私はそのように警告を使用すると思っていないでしょう。 –

関連する問題