2012-04-27 68 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

相关问题