【发布时间】:2014-11-28 01:46:13
【问题描述】:
这几天我一直在寻找这个问题的答案,但没有运气。
我正在尝试从通过 ajax 调用到 JSON REST Api 收集的数据构建图表。我使用 morris.js 来构建我的图表。图表的数据是通过 3 个嵌套的 ajax 调用收集的。第一个 ajax 调用检索包含任务的列表,成功时循环迭代结果并对每个结果进行 ajax 调用。并在这些调用成功时检索数据以构建图表。
在最后一个成功函数中,for loop 运行以构建包含图表数据的数组。
这些数据被推入图表的参数数组 (morris.js)。
所以 3 个嵌套的 ajax 调用,在第一次调用之后有一个 $.each 循环。
我的问题是每次 ajax 迭代都会生成图表。我一直在尝试将图表函数 (Morris.Donut(params);) 移到循环之外,但没有运气。
我的代码:
var arr = [];
var counts = [];
var test = [];
$.ajax({
url: "http://helpdesk.site.com/IT/_vti_bin/ListData.svc/ITHelpdeskRequests?$filter=TaskStatusValue%20eq%20%27Not%20Started%27",
headers: {
'accept': 'application/json;odata=verbose',
'content-type': 'application/json;odata=verbose'
},
success: function(data) {
$.each(data.d.results, function(a, data) {
$.ajax({
url: "http://helpdesk.site.com/IT/_vti_bin/ListData.svc/ITHelpdeskRequests(" + data.RequesterId + ")/CreatedBy",
headers: {
'accept': 'application/json;odata=verbose',
'content-type': 'application/json;odata=verbose'
},
success: function(data2) {
$.ajax({
url: "http://helpdesk.site.com/IT/_vti_bin/ListData.svc/ITHelpdeskRequests(" + data.AssignedToId + ")/AssignedTo",
headers: {
'accept': 'application/json;odata=verbose',
'content-type': 'application/json;odata=verbose'
},
success: function(data3) {
var params = {
element: 'taskchart',
data: [],
colors: ['#b85f28', '#d46125', '#CE4E00']
};
$(".inner").prepend('<p>'+data.Request +' <br>Submitted by: '+data2.d.Name+'<br>Assigned to: '+data3.d.Name+' | Due in: '+data.DueInDays+' day(s)</p>');
var indexOfName = arr.indexOf(data3.d.Name);
if (indexOfName == -1) {
arr.push(data3.d.Name);
counts.push(1);
} else {
counts[indexOfName] ++;
}
for (var i in arr, counts) {
test = {
'label': '' + arr[i] + '',
'value': counts[i]
}
params.data.push(test);
}
Morris.Donut(params);
}
})
}
})
})
}
})
我知道这段代码看起来有点乱,但我似乎无法更好地构建它。关于在 ajax 调用完成加载数据后如何构建图表的任何建议?
我真的是撞墙了。
【问题讨论】:
-
您的
data2没有在任何地方使用。 -
另外,由于这些基本上是顺序调用,您可以尝试将所有
$.ajax调用的async选项设置为false。$.each循环中的事情可能会出现问题。 -
我的错误。我之前确实使用它来显示其他一些数据,但我没有包括在内,因为它与我的问题无关。将立即编辑。
-
异步似乎没有什么不同。如何正确地将成功调用与回调联系起来?比如
function ajax1(data){ $.ajax({ url: "http://helpdesk.site.com/IT/_vti_bin/ListData.svc/ITHelpdeskRequests?$filter=TaskStatusValue%20eq%20%27Not%20Started%27", headers: { 'accept': 'application/json;odata=verbose', 'content-type': 'application/json;odata=verbose' }, ajax2(); }) };这样对吗?
标签: javascript jquery ajax morris.js