想象一下,我们有一个服务器端应用程序,可以生成充满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 请求。
以下是我尝试的选项。
iframe
。它工作正常,但为了
使用它我需要将我的输出从console.log("Iteration:
0");
改为<script language="JavaScript">console.log("Iteration:
0");</script>
,内容类型为 text / html ;并且还要模拟
POST表单提交到目标iframe
。另一个非常重要的事情:输出应该是一个流,因为服务器端应用程序使用持久的过程;所以make setTimeout(function() { $.ajax(...); }, 1000);
不是解决方案。
总而言之,我尝试了几个选项,但简单的iframe
是目前唯一真正有效的解决方案。否则,很可能我错过了一些东西。非常感谢任何想法和建设性的想法。
提前谢谢!
答案 0 :(得分:3)
长轮询和彗星是选择,但这些都是黑客攻击。您提到的Iframe方法并不可怕,但如果您需要恢复连接,则会出现一些状态问题。
我建议您重新考虑网络套接字。在github上有一个可爱的垫片available,它使用闪光灯(现在有一段时间的插座支持)作为后退。您可以像编写Web套接字一样编写客户端代码,并将填充程序添加到不支持它的浏览器中。太好了!