2012-04-27 14 views
1

JavaScriptコマンドでいっぱいのストリーミングコンテンツを生成するサーバーサイドアプリケーションがあるとします。サンプルアプリケーションを表示する最も簡単な方法は、Python/Flaskを使用することですが、各反復後に出力をフラッシュするだけの任意の言語を使用して実行できます。そのため、サンプルのサーバーサイドアプリケーションのために:ブラウザでストリーミングJSコンテンツを処理する最善の方法は何ですか?

from time import sleep from flask import Response 

@app.route('/stream', methods=['POST']) def stream(): 
    def generate(): 
     for i in range(10): 
      sleep(1) 
      yield 'console.log("Iteration: %d");\n' % i 
    return Response(generate(), mimetype='application/javascript') 

出力のこのような(1秒ポーズで10秒間)を返します。

console.log("Iteration: 0"); 
console.log("Iteration: 1"); 
console.log("Iteration: 2"); 
... 
console.log("Iteration: 9"); 

私は、「親」HTML/JavaScriptを作成する必要がありますこれらのコマンドをオンザフライで処理して実行するページ。つまり、ではなく、が10回の繰り返しがすべてロードされるまで待機します。また、サーバー側のアプリケーションに対して、POSTリクエストを送信することができます。

私が試した選択肢は次のとおりです。

  1. 私は別のオプションを使用してjQueryのAjaxのメソッドをテストしたが、それはまだ 一度にすべてのコマンドを実行するために、完全な生成された出力を必要とします。
  2. もう1つのアイデアはiframeです。それはうまく動作しますが、 を使用するには、出力タイプをconsole.log("Iteration: 0");から<script language="JavaScript">console.log("Iteration: 0");</script>に、コンテンツタイプをtext/htmlに変更する必要があります。ターゲットへの POSTフォームの提出をシミュレートするiframe
  3. 私はWebSocketについて読んでいます。しかし、この技術は現時点では であり、私のアプリケーションは となっていますので、私は に対処することを拒否しました。

別の非常に重要なこと:サーバー側のアプリケーションは、長期的なプロセスで動作しますので、出力は、ストリームする必要があります。だからsetTimeout(function() { $.ajax(...); }, 1000);は解決策ではありません。

要約すると、いくつかのオプションを試しましたが、単純なiframeは現時点で実際に動作する唯一の解決策です。それ以外の場合は、おそらく私は何かを逃しています。どんな考えや建設的なアイデアも非常に高く評価されています。

ありがとうございます!

+0

私はこれも可能であるとは確信していませんが、それは確かに推奨されません。あなたが実際にウェブソケットを備えたプッシュサーバーを使用しているように思えます。古いブラウザをサポートする必要がある場合は、フォールバックとしてJavaScriptをポーリングしてください。 – Endophage

+3

彗星はあなたを助けますか? http://en.wikipedia.org/wiki/Comet_(programming) – rt2800

+0

可能な重複:http:// stackoverflow。com/questions/7213549/long-polling-http-streaming-general-questions – Bergi

答えて

3

長いポーリングと彗星はオプションですが、これらはハックです。あなたが言及したIframeメソッドはひどいわけではありませんが、接続を回復する必要がある場合はいくつかの状態の問題があります。

ウェブソケットを再検討することをお勧めします。フレンドリーなシムavailableは、フラッシュ(これはしばらく前からソケットサポートを受けていました)を使用しているgithub上にフォールバックとしてあります。あたかもWebソケットが存在するかのようにクライアントサイドコードを書くことができ、シムはそれをサポートしていないブラウザに追加します。すばらしいです!

+0

いいアイデア、ありがとう!私は間違いなく私の文脈でFlash/WebSocketをテストします。 – VisioN

関連する問題