1

想象一下,我们有一个服务器端应用程序,它生成充满 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 的信息。然而,由于目前这项技术还没有得到绝对的支持,而且我的应用程序现在应该能够处理动态内容,所以我拒绝处理它。

另一个非常重要的事情:输出应该是一个流,因为服务器端应用程序使用一个持久的过程;所以 makesetTimeout(function() { $.ajax(...); }, 1000);不是解决方案。

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

先感谢您!

4

1 回答 1

3

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

我会鼓励你重新考虑网络套接字。github 上有一个可爱的 shim ,它使用 flash(现在已经支持 socket 有一段时间了)作为后备。您可以编写客户端代码,就好像存在 Web 套接字一样,然后 shim 将其添加到不支持它的浏览器中。伟大的!

于 2012-04-27T08:04:25.333 回答