将匿名ajax函数制作成常规函数 - 范围?

时间:2011-10-03 23:32:06

标签: javascript jquery scope

我是一个js / jquery noob并且一直在努力让匿名函数作为常规函数工作。有人能指出我做错了什么吗?

以下是我花了几个小时的时间:

var tracklist = new Array();

function stuffXML(xml) {
    $(xml).find('track').each(function(){
        var logo = $(this).find('logo').text();
        var location = $(this).find('location').text();
        var id = $(this).find('identifier').text();
        var info = $(this).find('info').text();
        var title = $(this).find('title').text();
        var creator = $(this).find('creator').text();

        tracklist.push(logo,location,id,info,title,creator);

    });

    console.log('mid' + tracklist);  //works here
}

$(document).ready(function(){

    $.ajax({
        type: "GET",
        url: "real.xml",
        dataType: "xml",
        success: stuffXML
    });

console.log(tracklist);  //but not here - empty array

});

我正在尝试将列表(一组图像和幻灯片的文本)解析成一个数组(在那里成功),然后让它们可用,但我的范围显然太局限了。我看不出我做错了什么...

任何帮助将不胜感激......

3 个答案:

答案 0 :(得分:2)

那里的数组是空的,因为该代码在DOM准备好后立即运行,但在XHR完成后不一定(并且极不可能)。

为了能够使用tracklist,您需要在stuffXML()函数内或在堆栈跟踪具有stuffXML()祖先的另一个函数中引用它。

答案 1 :(得分:2)

你的问题只是你忘记了AJAX中的A代表什么。异步。当您运行

命令时
$.ajax({
    type: "GET",
    url: "real.xml",
    dataType: "xml",
    success: stuffXML
});

它会毫不犹豫地立即运行它,并立即使用您的console.log跟踪 。在后台,浏览器正忙于请求数据,然后将其添加到tracklist变量中。所以,你想要做的是将那个console.log放在stuffXML中。当然,您可能希望执行除console.log之外的其他操作。因此,让'stuffXML'触发您需要触发的任何其他事件,以使其余代码执行它需要执行的操作。请记住,Web服务器不会更快地向您的页面提供请求,而不是javascript将要执行下一行代码。

答案 2 :(得分:1)

当您在文档就绪函数中调用console.log()时,Ajax请求不太可能完成:回调发生在Ajax请求结束时;文件就绪呼叫将在请求发出后立即发生。