为什么script.write脚本标记有时间延迟?为什么脚本标签执行会延迟?

时间:2011-05-25 05:28:00

标签: javascript iframe asynchronous document.write

在我的代码中,我创建了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. 为什么脚本标记的document.write有时滞?

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

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

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

  3. 在我们从iframe获得回复之前,我们如何暂停其余页面的加载?

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

    我试图在最后一个呼叫响应时在(4)设置一个标志,然后在(5)使用while循环暂停那里的页面加载。但似乎没有效果。如果是这样,iframe中的调用也将被阻止,直到while循环结束。

    是否有一种好方法可以暂停主线程(5)等待所有呼叫完成?

1 个答案:

答案 0 :(得分:0)

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

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

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

  4. 我最担心的是,您正在考虑使用您似乎无法掌握的技术构建高流量服务。你试图用不支持计时的语言做计时。

    此外,您的脚本中存在错误,content实际上并未写入。

    eval是邪恶的。必须有更好的方法。