在我的代码中,我创建了5个带有脚本标记的iframe,以便从服务器获取响应。 我们需要并行完成这项工作。另外由于跨域问题,我们没有选择Ajax技术,只是同时创建iframe来发出异步请求。
<script type="text/javascript" href="http://www.example1.com/json.js"></script>
<!-- //---------------------------------------------------------------------(1)-->
<script type="text/javascript">
var url = "http://www.example2.com/getResponse/";
var count = 5;
var callback = "callback";
function iframeCallback(index) {
var iframe = document.createElement('iframe');
iframe.style.border='0px';
iframe.style.width ='0px';
iframe.style.height='0px';
document.body.appendChild(iframe);
var content = "<script type='text/javascript'>";
content += "var begin = new Date();"; //------------------(2)
content += "var jsText = \"<script type='text/javascript' src='" + url + "'></\" + \"script>\";";
content += "document.write(jsText);";
content += "</"+"script>";
content += "<script type='text/javascript'>";
content += "var data = eval('"+callback+"');"; //------------------(3)
content += "window.parent.getRepsonse(data);";
content += "</"+"script>";
}
function getRepsonse(data) {
//Deal with the responses here
//------------------------------------------------------------------(4)
}
function doMainProcess() {
for (i=0; i<count; i++) {
iframeCallback(i);
}
//pause the main thread here to wait until calls are finished
//------------------------------------------------------------------(5)
//go on to do something else
}
</script>
我的问题在这里:
为什么脚本标记的document.write有时滞?
当我调试上面的代码时,我发现(1)和(2)之间存在时间差。有没有办法让这两个发生在同一时间?或者尽可能缩短延迟。
为什么脚本标签执行会延迟?
(2)和(3)之间的时间延迟也很奇怪。当我们尝试直接转到URL进行呼叫时,它只需要150ms,但如果我们使用脚本标签进行呼叫,则需要400ms +。 需要使呼叫时间尽可能接近直接呼叫。
在我们从iframe获得回复之前,我们如何暂停其余页面的加载?
出于某种原因,我们不能简单地使用“setTimeout”函数在(5)处创建时间延迟。
我试图在最后一个呼叫响应时在(4)设置一个标志,然后在(5)使用while循环暂停那里的页面加载。但似乎没有效果。如果是这样,iframe中的调用也将被阻止,直到while循环结束。
是否有一种好方法可以暂停主线程(5)等待所有呼叫完成?
答案 0 :(得分:0)
您无法控制浏览器何时呈现DOME元素或加载资源,您只能对它们做出反应。
如果有延迟,为什么不写一个等待所有异步过程完成的同步函数(比如收集数据)?
你不能暂停它,你只需要渲染它或渲染它但隐藏它。
我最担心的是,您正在考虑使用您似乎无法掌握的技术构建高流量服务。你试图用不支持计时的语言做计时。
此外,您的脚本中存在错误,content
实际上并未写入。
eval
是邪恶的。必须有更好的方法。