разделяя переменную javascript - PullRequest
0 голосов
/ 23 ноября 2010

В следующем коде я беру ввод вызова AJAX в функцию под названием ГНР (). Я хочу обнаружить при загрузке завершено с использованием переменной «done». Но основной поток блокирует переменная и скрипт зависает браузер. Если я поставлю предупреждение в закомментированное место, цель служил. Итак, какой другой способ я могу использовать сделать то же самое. Заранее спасибо ..

function openX() {
            LoadContentInto("Default.aspx", plr);
            var obj = null;
            done = false;
            function plr() {
                x = this.AJAXObject.responseText;
                t = x.indexOf('{')
                n = parseInt(x.substring(0, t));
                s = x.substring(t, n + t);
                p = eval('(' + s + ')');
                obj = p;
                done = true;
            }
            while (done != true)
            { // alert("hello"); 
            }
            alert(done);
        }

Ответы [ 2 ]

1 голос
/ 23 ноября 2010

В основном вам нужно сделать синхронный вызов ajax, поэтому нет необходимости создавать пустое (блокирующее) время.обратный вызов plr() будет выполнен при успешном ответе, затем остальные вызовы будут вызываться внутри этого обратного вызова

http://www.hunlock.com/blogs/Snippets:_Synchronous_AJAX

0 голосов
/ 23 ноября 2010

Не стоит так активно ждать результата. Когда вызов AJAX успешно завершен, вызывается функция обратного вызова. В вашем случае кажется, что это plr (хотя не совсем понятно, что именно делает LoadContentInto).

Кажется, у вас есть соблазн сделать синхронный обратный вызов успеха AJAX. Иногда у меня были такие страсти, но до сих пор всегда обнаруживалось, что есть и асинхронный путь.

Может быть, вы хотите что-то подобное:

function openX() {
  LoadContentInto("Default.aspx", plr);
  var obj = null;
  var done = false; // you have your variable global! Make it local!
  function plr() {
    x = this.AJAXObject.responseText;
    // ...
    // put your code here
    // ...
    alert("Done!");
    done = true;
  }
  setTimeout(function(){
    if (!done) {
      alert("Please wait!");
      // Does the response and/or the operation after the responseText arives take a long time?
      // Based on that decide how to inform the user
    }
  }, 100); // Set the timeout to right value.. based on your needs
}

Несколько комментариев к вашему коду:

  • вы объявили done глобальной переменной, весьма вероятно, что она должна быть локальной
  • while (done != true) намного чище, чем while (!done)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...