4

在我的代码中,我创建了 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>

我的问题在这里:

  1. 为什么 script 标签的 document.write 会有时间差?

    当我调试上面的代码时,我发现(1)和(2)之间存在时间差。有什么办法可以让两者同时发生?或者尽可能缩短延迟。

  2. 为什么脚本标签执行延迟?

    (2) 和 (3) 之间的时间延迟也很奇怪。当我们尝试直接去 URL 进行调用时,只需要 150ms,但是如果我们使用 script 标签进行调用,则需要 400ms+。需要使呼叫时间尽可能接近直接呼叫。

  3. 我们如何暂停页面其余部分的加载,直到我们得到 iframe 的响应?

出于某种原因,我们不能简单地使用“setTimeout”函数在 (5) 处创建时间延迟。

当最后一次调用响应时,我尝试在 (4) 处设置一个标志,然后在 (5) 处使用 while-loop 来暂停那里的页面加载。但似乎没有效果。如果是这样,iframe 中的调用也将被阻塞,直到 while-loop 完成。

有没有一种好方法可以在 (5) 处暂停主线程以等待所有调用完成?

4

1 回答 1

0
  1. 您无法控制浏览器何时呈现 DOMElement 或加载资源,您只能对它们做出反应。

  2. 如果有延迟,为什么不写一个同步函数来等待所有异步进程完成(比如收集数据)?

  3. 你不能暂停它,你只需要不渲染它或渲染它而是隐藏它。

我最担心的是您正在考虑在您似乎不掌握的技术上构建高流量服务。您正在尝试使用不支持计时的语言进行计时。

此外,您的脚本中有一个错误,content实际上并没有被写入。

并且eval是邪恶的。一定有更好的方法。

于 2011-05-30T22:46:59.410 回答