JQuery скрипт должен запускаться как асинхронный, но работает только синхронизация?Зачем? - PullRequest
0 голосов
/ 17 августа 2010

У меня есть небольшой скрипт jquery, который не работает, если я удаляю часть «async: false» ... И я не понимаю, почему (часть alert () существует только для того, чтобы проверить, работает она или нет),Я думаю, что это будет работать асинхронно, но это не так.Может кто-нибудь объяснить мне, почему?И что я должен изменить, чтобы сделать его асинхронным?

$(document).ready(function(){
    var artistName = new Array();
    var artistPlaycount = new Array();

    $('#inputForm').submit(function(){
        var userName = $('#username').attr('value'); 
        var amount = $('#amount').attr('value');

        userName = "someUsername"; 

        $.ajax({  
            type: "POST",  
            url:  "prepXML.php",  
            data: "method=getartists&user="+userName+"&amount="+amount,  
            dataType: "xml",
            async:false,
            success: function(xml){ 
                var i = 0;  
                $("artist",xml).each(function(){
                    artistName[i] = $(this).find("name").text();
                    artistPlaycount[i] = $(this).find("playcount").text();
                    i++;
                });
            }
        });         
    }); 

    alert(artistName[2]); //or any other iteration number
});

спасибо

Ответы [ 3 ]

3 голосов
/ 17 августа 2010

Чтобы сделать это асинхронно, вам нужно переместить предупреждение в функцию обратного вызова и удалить параметр async, например:

    $.ajax({  
        type: "POST",  
        url:  "prepXML.php",  
        data: "method=getartists&user="+userName+"&amount="+amount,  
        dataType: "xml",
        success: function(xml){ 
            $("artist",xml).each(function(i){
                artistName[i] = $(this).find("name").text();
                artistPlaycount[i] = $(this).find("playcount").text();
            });
            alert(artistName[2]);
        }
    }); 

В противном случае функция success, заполняющая массив, происходит после предупреждение делает ... так что то, что вы хотите, еще не совсем там.До тех пор, пока запрос не вернется с сервера, обработчик success не выполнится.

Кроме того, первым параметром для обратного вызова .each() является индекс, его можно использовать, нетнеобходимо сохранить собственную инкрементную переменную:)

0 голосов
/ 17 августа 2010

вам нужно переместить предупреждение в ваш обработчик успеха.

alert(artistName[2]); //or any other iteration number

должно появиться сразу после того, как вы пройдете через xml.

, поэтому вы должны иметь:

success: function(xml){ 
            var i = 0;  
            $("artist",xml).each(function(){
                artistName[i] = $(this).find("name").text();
                artistPlaycount[i] = $(this).find("playcount").text();
                i++;
            });
            alert(artistName[2]); //or any other iteration number
        }
0 голосов
/ 17 августа 2010

Не работает, потому что обратный вызов срабатывает после alert. Поместите alert в обратный вызов.

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