想象一下,我们有一个服务器端应用程序,可以生成充满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