多维数组和jQuery的getJSON

我向我的应用程序中的控制器提交了一个getJSON请求,该控制器返回带有2个“应用程序”的有效JSON。 我知道这个事实就好像我将alert语句移动到jQuery的每个函数中它会给我预期的结果。

我试图将这些数据存储在一个多维数组中,以便以后与extJS’菜单控件一起使用。

码:

Ext.onReady(function() { var applicationList = []; jQuery.getJSON('index.php/applications', function(data) { jQuery.each(data.applications, function (i, app) { applicationList[i] = []; applicationList[i]['text'] = app['title']; applicationList[i]['id'] = app['slug']; }); }); alert(applicationList[0]['text']); var applicationMenu = Ext.menu.Menu({ items: applicationList }); }); 

JSON响应:

 {"applications":[{"slug":"test","title":"Test"},{"slug":"hardware","title":"Hardware"}]} 

预期结果:

测试

实际结果(来自Firebug):

applicationList [0]未定义

如果我替换上面的alert() ,使用以下代码我会得到一个警告窗口,其中包含文本“remove”:

 for (p in applicationList) { alert(p); } 

现在,我的想法是JSON请求没有及时完成alert()所以我将使用命名回调函数来确保请求已完成:

 var data; jQuery.getJSON('index.php/applications', get_applications(data)); function get_applications(data) { jQuery.each(data.applications, function (i, app) { applicationList[i] = []; applicationList[i]['text'] = app['title']; applicationList[i]['id'] = app['slug']; }); }; 

但现在Firebug告诉我data is undefined ……

我觉得自己几乎就在那里,但过去一小时我几乎就在那里,我觉得好像我现在只是在试图让它发挥作用时污染源头。

这应该这样做:

 Ext.onReady(function() { var applicationList = []; var applicationMenu; jQuery.getJSON('index.php/applications', function(data) { jQuery.each(data.applications, function (i, app) { applicationList[i] = []; applicationList[i]['text'] = app['title']; applicationList[i]['id'] = app['slug']; }); applicationMenu = Ext.menu.Menu({ items: applicationList }); }); }); 

你的想法是对的; 它不起作用的原因是因为AJAX是一个异步过程,当你触发getJSON函数时,javascript继续运行。 您的解决方案不起作用,因为将其作为命名回调并不会改变在您尝试初始化菜单之前不会触发它的事实。 我的所有解决方案都是将菜单启动代码移动到回调中,因为只有这样您才能访问已填写的applicationList。

你是对的,你应该在getJSON回调完成后才使用你的“applicationList”变量。

你应该在jQuery.each()之后在你的getJSON回调中调用Ext.menu.Menu()。

Paolo Bergantino的解决方案应该可行,但您也可以使用命名回调函数按照自己的方式执行 – 您只是在代码中犯了一些小错误:

  1. 数据不应该声明为变量 – “function get_applications(data)”中的数据只代表.getJSON返回的数据
  2. .getJSON中的回调函数应该只是函数的名称,没有(数据)

这是更正后的代码:

 jQuery.getJSON('index.php/applications', get_applications); function get_applications(data) { jQuery.each(data.applications, function (i, app) { applicationList[i] = []; applicationList[i]['text'] = app['title']; applicationList[i]['id'] = app['slug']; }); }; 
 $.getJSON("getq2.php",{yr:year,typ:type},function(data) { var items1 = new Array(); var j=0; for ( var i in data ) { var items = new Array(); items.push(data[i][0],Number(data[i][1])); items1[j++] = items; } console.log(items1); var plot1 = jQuery.jqplot('chartContainer', [items1], { seriesDefaults: { // Make this a pie chart. renderer: jQuery.jqplot.PieRenderer, rendererOptions: { startAngle: 180, sliceMargin: 2, dataLabelThreshold: 2, // Put data labels on the pie slices. // By default, labels show the percentage of the slice. showDataLabels: true, } }, grid: {borderWidth:0, shadow:false,background: '#d8d6cb'}, legend:{placement:'outside',show:true,location:'e',background:'transparent',marginRight:'30px'} }); });