所以我使用一个全局变量,为什么这段代码返回一个'undefined'的警告

So I went with using a global variable, why does this code come back with an alert of 'undefined'?

本文关键字:一个 返回 代码 警告 undefined 全局变量 为什么 段代码      更新时间:2023-09-26

我想要的是从一个函数检索到的数据显示在另一个。有人告诉我,使用全局变量将允许我完成这一点。存储值以供以后的函数使用的最佳方法是什么?我听说全局变量是邪恶的。

这是我试过的。http://jsfiddle.net/8j947/17/

当我尝试将全局变量显示为警报时,它返回为未定义(在jsfiddle上可能无法查看)。我认为这是因为数据实际上并没有被存储,但我只写了3周的代码,所以我知道什么。如果你们能帮助我,告诉我哪里做错了,或者提出一个替代的解决方案,那就太好了。

底部的警报函数在getCrossDomainJson被调用之后立即执行,并且在传递给getCrossDomainJson的回调函数被调用之前执行。由于someProperty属性是在回调函数中设置的,当您在警报中引用它时,它实际上还没有设置。

给你的警报函数一个名字,并在回调函数完成后在别处调用它。

function getCrossDomainJson(url, callback) {
    $.ajax({
        url: "http://query.yahooapis.com/v1/public/yql?callback=?",
        data: {
            q: 'select * from xml where url="' + url + '"',
            format: "json"
        },
        dataType: "jsonp",
        success: callback
    });
}
var MyStatus = {};
getCrossDomainJson("http://xdiscgolfplanetx.channel-api.livestream-api.com/2.0/getstream", function(data) {
    // data is in JSON format:
    console.dir(data);
    if (data && data.query && data.query.results && data.query.results.channel) {
        var isLive = (data.query.results.channel.isLive);
        MyStatus.someProperty = data.query.results.channel.isLive;
    // alert (isLive)
        if (isLive == 'true') {
            alert ('working')
        }
        alertSomeProperty();            // now that the someProperty property has been set and MyStatus 
                                        //is global, you'll see that you can refer to it even outside of this block
    }
});
function alertSomeProperty(){
    alert (MyStatus.someProperty)
}

这是使用异步编程时的一个典型错误。你不能再考虑一个单一的逐步执行顺序,调用函数a(),然后b(),然后c()。当使用任何形式的ajax调用时,它通常是异步的。这意味着调用函数只是开始它的执行。

它将在后台运行,其余的javascript将继续运行并完成。然后,稍后,ajax调用将完成,它将调用它的成功函数。只有从成功函数或从成功函数调用的任何其他代码中,才能实际使用ajax调用的结果。你需要做的就是启动ajax调用然后javascript代码完成。然后编写一个成功函数,该函数将在ajax调用完成时执行需要执行的其余操作。此时,您就有了JSON数据,可以对它做任何想做的事情。你可以获取这些数据并调用其他函数,将其传递给它们,以便它们可以对其进行操作。

因此,从成功处理程序中踢出执行的第二步。无论您需要对检索到的数据做什么,都应该从成功处理程序开始。

所以,如果你想要执行的流程是这样的:

a();
b();
getJSONdata();
c();
d();

你必须这样组织它:

a();
b();
getJSONdata("xxx", function(data) {
    c(data);
    d();
})
function c(myData) {
    // do something with the passed in data
}

其中c()和d()发生在成功函数中检索JSON数据,只有在数据可用后才调用它们。