Почему существует задержка по времени для document.write тега script?И почему выполнение тега скрипта задерживается? - PullRequest
4 голосов
/ 25 мая 2011

В своем коде я создал 5 фреймов с тегом script для получения ответов от сервера. нам нужно сделать это параллельно. Кроме того, из-за междоменных проблем мы не выбрали технологию Ajax, просто создавая фреймы одновременно для выполнения асинхронных запросов.

<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 тега script?

    Когда я отлаживал код выше, я обнаружил, что между (1) и (2) существует задержка во времени. Есть ли способ сделать так, чтобы два произошло одновременно? Или уменьшите задержку как можно короче.

  2. Почему задерживается выполнение тега скрипта?

    Задержка между (2) и (3) также странная. Когда мы пытаемся перейти непосредственно к URL-адресу для вызова, это займет всего 150 мс, но если мы используем тег script для выполнения вызова, это займет 400 мс +. Необходимо максимально приблизить время звонка к прямому звонку.

  3. Как мы можем приостановить загрузку остальной части страницы, пока не получим ответы от iframes?

По какой-то причине мы не можем просто использовать функцию "setTimeout" для создания временной задержки в (5).

Я попытался установить флаг в (4) при ответе на последний вызов, а затем использовать цикл while в (5), чтобы приостановить загрузку страницы. но, похоже, не имеет никакого эффекта. Если это так, то вызовы в iframes также будут блокироваться до завершения цикла while.

Есть ли хороший способ приостановить основной поток в (5), чтобы дождаться завершения всех вызовов?

1 Ответ

0 голосов
/ 31 мая 2011
  1. Вы не можете контролировать, когда браузер отображает DOMElements или загружает ресурсы, вы можете только реагировать на них.

  2. Если есть задержка, почему бы не написатьфункция синхронизации, которая ожидает завершения всего асинхронного процесса (например, сбор данных)?

  3. Вы не можете приостановить его, вы просто должны не отображать его или отображать, а скрывать.

Что меня больше всего беспокоит, так это то, что вы думаете о создании службы с высоким трафиком на основе технологии, которую вы, похоже, не понимаете.Вы пытаетесь выполнить синхронизацию на языке, который не поддерживает синхронизацию.

Кроме того, в вашем скрипте есть ошибка, content на самом деле не пишется.

И eval это зло.Должен быть лучший способ.

...