jQuery脚本应该运行异步但只能同步吗?为什么?

时间:2010-08-17 17:52:46

标签: javascript jquery ajax synchronization

我有这个小的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 个答案:

答案 0 :(得分:3)

要异步执行此操作,您需要将警报移动到回调中并删除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()回调的第一个参数是索引,您可以使用它,无需保留自己的递增变量:)

答案 1 :(得分:0)

它不起作用,因为回调是在alert之后触发的。将alert放入回调中。

答案 2 :(得分:0)

您需要将警报移动到成功处理程序中。

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
        }