2012-04-27 65 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') 

它返回(在10秒1秒暫停)這種輸出的:

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

我需要創建一個「父」 HTML/JavaScript的頁面,它可以即時處理和執行這些命令,即而不是等待所有10次迭代都將被加載。另外,它應該能夠服務POST請求到所提到的服務器端應用程序。

這裏是我嘗試過的選項。

  1. 我測試了不同選項的jQuery Ajax方法,但它仍然需要全部生成的輸出來一次執行所有命令。
  2. 另一個想法是使用iframe。它工作正常,但爲了 使用它我需要將我的輸出從console.log("Iteration: 0");改爲<script language="JavaScript">console.log("Iteration: 0");</script>,內容類型爲text/html;並模擬 POST表單提交到目標iframe
  3. 我已閱讀關於WebSockets。但是,由於此技術目前絕對不支持 ,我的申請應該是 ,現在已經可以與即時內容一起工作,所以我拒絕與其交易 。

還有很重要的一點:輸出應該是一個流,因爲服務器端應用程序使用一個長期持久的過程;所以使setTimeout(function() { $.ajax(...); }, 1000);不是解決方案。總結一下,我試過了幾個選項,但簡單的iframe是目前唯一真正有效的解決方案。否則,很可能我錯過了一些東西。任何想法和建設性的想法非常感謝。

預先感謝您!

+0

我不確定這是甚至可能的,如果是,當然不是可取的。聽起來你真的應該使用帶有網絡套接字的推送服務器。如果您必須支持舊版本的瀏覽器,那麼請將javascript作爲回退... – Endophage 2012-04-27 07:02:44

+3

Can Comet可以幫助您嗎? http://en.wikipedia.org/wiki/Comet_(programming) – rt2800 2012-04-27 07:08:45

+0

可能的重複:http:// stackoverflow。com/questions/7213549/long-polling-http-streaming-general-questions – Bergi 2012-04-27 07:43:41

回答

3

long-polling and comet are options,but these are hacks。您提到的Iframe方法並不可怕,但如果您需要恢復連接,則會遇到一些狀態問題。

我鼓勵你重新考慮網絡套接字。在github上有一個可愛的墊片available,它使用閃存(現在有一段時間有插槽支持)作爲回退。您可以編寫客戶端代碼,就好像Web套接字存在一樣,而Shim會將其添加到不支持它的瀏覽器。大!

+0

不錯的主意,謝謝!我肯定會在我的上下文中測試Flash/WebSocket。 – VisioN 2012-04-27 08:08:14

相關問題