想象一下,我們有一個服務器端應用程序,可以生成充滿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')
它返回(在10秒1秒暫停)這種輸出的:
console.log("Iteration: 0");
console.log("Iteration: 1");
console.log("Iteration: 2");
...
console.log("Iteration: 9");
我需要創建一個「父」 HTML/JavaScript的頁面,它可以即時處理和執行這些命令,即而不是等待所有10次迭代都將被加載。另外,它應該能夠服務POST請求到所提到的服務器端應用程序。
這裏是我嘗試過的選項。
- 我測試了不同選項的jQuery Ajax方法,但它仍然需要全部生成的輸出來一次執行所有命令。
- 另一個想法是使用
iframe
。它工作正常,但爲了 使用它我需要將我的輸出從console.log("Iteration: 0");
改爲<script language="JavaScript">console.log("Iteration: 0");</script>
,內容類型爲text/html;並模擬 POST表單提交到目標iframe
。 - 我已閱讀關於WebSockets。但是,由於此技術目前絕對不支持 ,我的申請應該是 ,現在已經可以與即時內容一起工作,所以我拒絕與其交易 。
還有很重要的一點:輸出應該是一個流,因爲服務器端應用程序使用一個長期持久的過程;所以使setTimeout(function() { $.ajax(...); }, 1000);
不是解決方案。總結一下,我試過了幾個選項,但簡單的iframe
是目前唯一真正有效的解決方案。否則,很可能我錯過了一些東西。任何想法和建設性的想法非常感謝。
預先感謝您!
我不確定這是甚至可能的,如果是,當然不是可取的。聽起來你真的應該使用帶有網絡套接字的推送服務器。如果您必須支持舊版本的瀏覽器,那麼請將javascript作爲回退... – Endophage 2012-04-27 07:02:44
Can Comet可以幫助您嗎? http://en.wikipedia.org/wiki/Comet_(programming) – rt2800 2012-04-27 07:08:45
可能的重複:http:// stackoverflow。com/questions/7213549/long-polling-http-streaming-general-questions – Bergi 2012-04-27 07:43:41