在浏览器中处理流JS内容的最佳方法是什么?

时间:2012-04-27 06:57:54

标签: javascript jquery html server-side http-streaming

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

返回(在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的内容。但是,由于这项技术不是 目前绝对支持,我的申请应该是 我现在已经能够处理动态内容了,我拒绝处理 用它。
  4. 另一个非常重要的事情:输出应该是一个流,因为服务器端应用程序使用持久的过程;所以make setTimeout(function() { $.ajax(...); }, 1000);不是解决方案。

    总而言之,我尝试了几个选项,但简单的iframe是目前唯一真正有效的解决方案。否则,很可能我错过了一些东西。非常感谢任何想法和建设性的想法。

    提前谢谢!

1 个答案:

答案 0 :(得分:3)

长轮询和彗星是选择,但这些都是黑客攻击。您提到的Iframe方法并不可怕,但如果您需要恢复连接,则会出现一些状态问题。

我建议您重新考虑网络套接字。在github上有一个可爱的垫片available,它使用闪光灯(现在有一段时间的插座支持)作为后退。您可以像编写Web套接字一样编写客户端代码,并将填充程序添加到不支持它的浏览器中。太好了!