我在从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;
};
这里的问题可能是什么?
答案 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是异步的,因此它将与您的下一个控制台语句并行执行。