【问题标题】:making an anonymous ajax function into a regular function - scope?将匿名 ajax 函数变成常规函数 - 作用域?
【发布时间】:2011-11-30 07:22:51
【问题描述】:

我是一个 js/jquery 菜鸟,一直在努力让匿名函数作为常规函数工作。有人可以指出我做错了什么吗?

这花了我几个小时:

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

});

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

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

【问题讨论】:

    标签: javascript jquery scope


    【解决方案1】:

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

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

    【讨论】:

    • 现在是早上,我明白你的意思了……这将是一件坏事。它加载的页面很重,确实需要异步。你能解释一下你的意思吗?
    【解决方案2】:

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

    【讨论】:

    • 是的 - 这是有道理的。我一直忘记它是向内解析,而不是向外解析。非常感谢!
    • @Holland 不知道这意味着什么,这不是解析问题,而是执行顺序问题:回调按照看到的顺序进行解析,但在 ajax 调用完成后执行。
    • 是的。。现在是凌晨 2 点 30 分;那时有点累和发呆。我现在明白你的意思了。
    【解决方案3】:

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

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

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

    【讨论】:

    • 谢谢!我没有注意到我从 ajax 调用中删除了“async: false”。非常非常感谢(现在我可以睡觉了……)
    • @Holland:几乎没有充分的理由去做同步 XHR。为请求锁定浏览器绝不是一个好主意。
    • 我遇到了一些我实际上不得不使用同步调用的地方,但它们很少而且相差甚远......并且需要大量的争论和深思熟虑。大多数时候,它们只是被滥用:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 2017-08-13
    • 2011-09-10
    • 1970-01-01
    • 2011-12-15
    • 2011-06-22
    • 2011-12-11
    相关资源
    最近更新 更多