想象一下,我们有一个服务器端应用程序,它生成充满 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请求。
这是我尝试过的选项。
- 我用不同的选项测试了 jQuery Ajax 方法,但它仍然需要完全生成的输出来一次执行所有命令。
- 另一个想法是使用
iframe
. 它工作正常,但为了使用它,我需要将我的输出改写console.log("Iteration: 0");
为<script language="JavaScript">console.log("Iteration: 0");</script>
内容类型为text/html;并且还可以模拟 POST 表单提交到目标iframe
。 - 我已阅读有关 WebSockets 的信息。然而,由于目前这项技术还没有得到绝对的支持,而且我的应用程序现在应该能够处理动态内容,所以我拒绝处理它。
另一个非常重要的事情:输出应该是一个流,因为服务器端应用程序使用一个持久的过程;所以 makesetTimeout(function() { $.ajax(...); }, 1000);
不是解决方案。
总而言之,我尝试了几种选择,但简单iframe
是目前唯一真正有效的解决方案。否则,很可能我错过了一些东西。非常感谢任何想法和建设性的想法。
先感谢您!