在ajax调用中使用的javascript中的全局变量

时间:2012-03-18 11:53:50

标签: javascript jquery

我在var idCategories= new Array();中声明了一个全局变量file.js 我在这个函数中使用它

function test() {
    $.ajax({
        type: "GET",
        url: "http://my_site/api/categories?ws_key=" 
             + ws_key  
             + "&PHP_AUTH_USER=" + PHP_AUTH_USER,
        dataType: "xml",
        success: parseXml
    });
    function parseXml(xml) {
        var i = 0;
        $(xml).find("category").each(function () {
            idCategories[i] = $(this).attr('id');
            // length increments at each iteration
            alert("length=" + idCategories.length);                 
            i = i + 1;
        });
    }
    alert("length=" + idCategories.length); //returns 0
}

在函数parseXml(xml)中,数组长度增加很多,但在此函数长度= 0之外!所以我不能在另一个函数中使用数组idCategories

5 个答案:

答案 0 :(得分:3)

问题是AJAX调用是ASYNC。因此,parseXml很可能(如果不是总是)在调用警报后调用。

为什么不:

function test() {
    $.ajax({
        type: "GET",
        url: "http://my_site/api/categories?ws_key=" 
             + ws_key  
             + "&PHP_AUTH_USER=" + PHP_AUTH_USER,
        dataType: "xml",
        success: parseXml
    });
    function parseXml(xml) {
        var i = 0;
        $(xml).find("category").each(function () {
            idCategories[i] = $(this).attr('id');
            // length increments at each iteration
            alert("length=" + idCategories.length);                 
            i = i + 1;
        });
        alert("length=" + idCategories.length); //returns 0
    }
}

答案 1 :(得分:1)

尝试使用对象和数组

function parseXml(xml) {var obj={};var a = [];
  $(xml).find("category").each(function(i)  {
obj["idCategory"]= $(this).attr('id');
a.push(obj);
alert("length="+a.length);// length increments at each iteration
       });
}
alert("length="+a.length);//returns 0

}

答案 2 :(得分:1)

$ .ajay默认是asynchronus函数!这意味着当它开始执行时它不会阻止应用程序流。你在$ .ajax成功函数之前执行警报语句。你有两个解决方案。

  1. 将asny参数设置为false。

    $.ajax({
        type: "GET",
        async: false, 
    

    ...

  2. parseXml 函数中调用提醒。

  3. 我相信你最好的选择是 async:false ,但正确的做法是在 $。ajax 调用完成后推进脚本执行(执行parsexml函数中的下一步。)

答案 3 :(得分:0)

这个问题每天出现多次。您正在进行异步调用,该警报行将在返回Ajax调用之前触发。

答案 4 :(得分:0)

Ajax是异步的。在传递响应之前,会调用alert("length="+idCategories.length);代码。