1

JavaScript コマンドでいっぱいのストリーミング コンテンツを生成するサーバー側アプリケーションがあるとします。サンプル アプリケーションを表示する最も簡単な方法は、Python/Flask を使用することですが、反復ごとに出力をフラッシュするだけで任意の言語を使用して実行できます。したがって、サンプルのサーバー側アプリケーションの場合:

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 つのアイデアは、 を使用することでしたiframeconsole.log("Iteration: 0");それは正常に動作しますが、それを使用するには、からの出力を<script language="JavaScript">console.log("Iteration: 0");</script>コンテンツタイプtext/htmlに言い換える必要があります。また、ターゲットへの POST フォーム送信をシミュレートしiframeます。
  3. WebSocket について読みました。しかし、現時点ではこの技術は完全にはサポートされておらず、私のアプリケーションはオンザフライ コンテンツを処理できるはずなので、私はそれを処理することを拒否しました。

もう 1 つの非常に重要なことは、サーバー側のアプリケーションは長期的なプロセスで動作するため、出力は stream である必要があるということです。したがって、makesetTimeout(function() { $.ajax(...); }, 1000);は解決策ではありません。

要約すると、いくつかのオプションを試しましたがiframe、現時点で実際に機能する唯一のソリューションはシンプルです。そうでなければ、おそらく何かが欠けています。どんな考えや建設的なアイデアも大歓迎です。

前もって感謝します!

4

1 に答える 1

3

long-Polling と comet はオプションですが、これらはハックです。あなたが言及した Iframe メソッドはひどいものではありませんが、接続を回復する必要がある場合、いくつかの状態の問題があります。

Web ソケットを再考することをお勧めします。フォールバックとしてフラッシュ (しばらくの間ソケットをサポートしていた) を使用する github で利用可能な素敵な shim があります。Web ソケットが存在するかのようにクライアント側のコードを記述でき、shim はそれをサポートしていないブラウザーに追加します。すごい!

于 2012-04-27T08:04:25.333 に答える