调用getJSON()后JavaScript变量为空

时间:2017-03-29 18:13:01

标签: javascript 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;
};

这里的问题可能是什么?

3 个答案:

答案 0 :(得分:1)

你的职能:

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

常规做法 - 返回承诺而不是数据:

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

// more code here

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

看看这些更详细的演示 ES5上的jQuery: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);

答案 1 :(得分:0)

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

这将首先运行:

$.getJSON('http://localhost/data');
console.log(data2);
SelectedData= data2;
return SelectedData;
几秒钟之后.done事件将被解雇 然后这将运行

data2 =json;
console.log(data2);

我的建议是在.done函数中调用另一个处理答案的函数,而不是等待返回值,它将在代码中以undefined形式返回

答案 2 :(得分:-2)

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