Цикл не работает без alert () в ajax readystate () - PullRequest
3 голосов
/ 22 октября 2009

Описание проблемы: Здравствуйте!

Мой объект XMLHTTPRequest, когда будет готов, выполняет пару вещей. Текст responseText, который я получаю, разделяется и отправляется в качестве параметра myFunction().

Теперь мне нужно вызвать myFunction() 'n' количество раз с подстрокой текста ответа в качестве параметров.

Это работает:

myAjaxObj.onreadystatechange=function() 
    {   
        if(myAjaxObj.readyState==4) 
        {
            if(myAjaxObj.status==200) 
                        {
                            myFunction( myAjaxObj.responseText, id )

Это НЕ РАБОТАЕТ:

myAjaxObj.onreadystatechange=function() 
    {   
        if(myAjaxObj.readyState==4) 
        {
            if(myAjaxObj.status==200) 
                        {
                            var count i=0;
                            for( i=0; i < 5; i++ )
                            {   
                                [b]alert("Without this it wont work") [/b]
                                myFunction( myAjaxObj.responseText, i );
                            }

По сути, код внутри цикла for не будет работать, если только alert () не закомментирован. Я где-то читал о закрытиях javascript и фактах, что это как бы дает выполнение / рендеринг для синхронизации

Каким было бы решение?

1 Ответ

3 голосов
/ 22 октября 2009

ОК, это происходит потому, что вы не опрашиваете свою функцию onreadystatechange. По сути, вызов асинхронный, и вам нужно опрашивать переменную readyState каждые несколько миллисекунд, чтобы увидеть, когда она изменится. По этой причине он работает с alert () - предупреждение вызывает длительную паузу, во время которой клиент получает ответ AJAX. Переменная readyState проверяется после того, как предупреждение получило ответ, и ваш код выполняется по мере необходимости.

Однако без оповещения () ваш код проверяет переменную readyState просто один раз

Один из способов - сделать синхронный вызов , установив для асинхронного параметра значение false в вызове. Недостатком является то, что клиент будет зависать до получения ответа AJAX.

Другой способ - продолжить опрос переменной readyState.

По сути, вы не должны доверять функции обратного вызова для правильного выполнения - она ​​застревает много раз!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...