我试图将数据添加到就绪函数中的全局数组变量中。当我稍后尝试使用数据时,数组是空的。
这是我的现成功能:
var counter = 0;
var services = [];
var names = []
var serviceData = []
$(document).ready(function () {
$.getJSON(JSurl + "/Home/getServicesForCustomer?name=" + '@Model', function (data) {
$.each(data, function (index, value) {
console.log("Trying to push services : " + JSON.parse(value.jsonTEMPLATE).komponent);
services.push(JSON.parse(value.jsonTEMPLATE).komponent);
console.log("After push : " + services);
names.push(value.Name);
serviceData.push(value.jsonDATA);
});
});
drawKomp(0);
});这是我想要使用数据的函数。
function drawKomp(index) {
console.log("Services in draw" + services);
});这是日志
Services in draw NewCustomerWizard?name=Testkund:104
Uncaught TypeError: Cannot read property 'length' of undefined jquery-2.0.3.js:564
Trying to push services : [object Object],[object Object] NewCustomerWizard?name=Testkund:90
After push : [object Object],[object Object] NewCustomerWizard?name=Testkund:92
Trying to push services : [object Object],[object Object],[object Object] NewCustomerWizard?name=Testkund:90
After push : [object Object],[object Object],[object Object],[object Object],[object Object] 为什么我读不懂?似乎我的数据被添加到了服务数组中。
发布于 2014-03-12 10:03:37
正如Bojangles提到的,这是因为您的代码是异步执行的。
当JS解释器到达$.getJSON行时,浏览器发送一个请求以获取所需的数据。一旦服务器响应,回调函数就会被调用。但同时,在服务器响应之前,解释器到达drawKomp(0)。
由于ajax调用需要一些时间,如果解释器在这里停止执行,那就太疯狂了。这就是为什么提供回调函数的原因。
所以代码执行如下所示:
Send request to JSUrl and remeber function(data){...} to be executed when you got data
call drawKomp(0)
.
.
.
ajax call finished, call function(data){...}因此,您必须确保在将数据推送到数组之前不会调用drawKomp(0)。
发布于 2014-03-12 10:10:33
解决这一问题的最简单方法是:
$(document).ready(function () {
$.getJSON(JSurl + "/Home/getServicesForCustomer?name=" + '@Model', function (data) {
$.each(data, function (index, value) {
console.log("Trying to push services : " + JSON.parse(value.jsonTEMPLATE).komponent);
services.push(JSON.parse(value.jsonTEMPLATE).komponent);
console.log("After push : " + services);
names.push(value.Name);
serviceData.push(value.jsonDATA);
});
drawKomp(0);
});
});这样,在加载和处理json之后,drawKomp就会被执行。
您也可以使用延迟对象,但这可能会变得复杂。
https://stackoverflow.com/questions/22347452
复制相似问题