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 在您的代码中未定义
我在从 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 在您的代码中未定义