JavaScript 调用 getJSON() 后变量为空

JavaScript variable empty after call of getJSON()

我在从 JSON 文件导入数据时遇到了这个问题。我使用 .getJSON 函数获取数据,这意味着根据控制台日志工作,但是一旦我移出 getJSON 子函数,data2 中的数组就会消失。我已将其缩小到此处的这一部分:

function prepData() {
    data2 = [];

    $.getJSON('http://localhost/data').done(function(json) {
        data2 =json;
        console.log(data2);
    });

    console.log(data2);
    SelectedData = data2;
    return SelectedData;
};

这里可能是什么问题?

你的函数:

function(json) {
    data2 = json;
}

之后执行
console.log(data2);
SelectedData = data2;

data2 尚未定义。


(1) function prepData(){
(2)    data2 = []; 

(3)    $.getJSON('http://localhost/data').done(function(json) {
(4)        data2 =json;
(5)        console.log(data2);
       });

(6)    console.log(data2);
(7)    SelectedData= data2;
(8)    return SelectedData;
   };

执行顺序:

1 -> 2 -> 3 -> 6 -> 7 -> 8 -> 4 -> 5

常见做法 - Return 承诺而不是数据:

function prepData(){
    return $.getJSON('http://localhost/data');
}

// more code here

prepData().done(function(json){
    console.log(json);
});

看看这些更详细的演示。
jQuery 在 ES5 上:https://jsfiddle.net/DerekL/xtmy6po0/

function timeout(n){
    // create promise
    var defer = $.Deferred();

    // resolve after n milliseconds
    setTimeout(function(){
        defer.resolve(n);
    }, n);

    // return new promise that apply custom text
    return defer.then(function(v){
        return "Resolved after " + (v/1000) + " seconds";
    });
}

timeout(3000).then(function(message){
    // will be executed after 3 seconds
    alert(message);
});

等效的 ES7:https://jsfiddle.net/DerekL/8kLknbne/

async function timeout(n){
    // create timer
    let timer = () => new Promise(resolve => setTimeout(() => resolve(n), n));
    // return message
    return "Resolved after " + (await timer()/1000) + " seconds";
}

// call
timeout(3000).then(alert);

$.getJSON 是异步的,因此它将与您的下一个控制台语句并行执行。

.done 是一个事件,因此它会比其他脚本晚几毫秒或几秒发生,它仅在对 http://localhost/data 的请求完成时发生

这将 运行 首先:

$.getJSON('http://localhost/data');
console.log(data2);
SelectedData= data2;
return SelectedData;

几秒钟后,将触发 .done 事件 那么这将 运行

data2 =json;
console.log(data2);

我的建议是在 .done 函数中调用另一个处理答案的函数,而不是等待 return 值,这将 return 在您的代码中未定义