我有一个构建了一个php后端,它返回一个JSON对象(实际上是一个2D数组,我可以引用它为json[0][0]
,例如,我不知道为什么,我没有解析JSON对象)在两个车站之间的火车上的信息(列车编号,运行天数等)。
现在我想查询每列火车的可用性。我已经有了php脚本(它还返回一个JSON对象,给出了指定日期以及接下来5天的可用性。)。
这个可用性php脚本需要一些输入作为每个嵌套(使用的错误术语?)数组的第一个元素,例如:json[0][0], json[1][0], json[2][0]
如果返回3列火车
我希望将此信息作为对并行ajax调用的响应返回。最后,我想根据这些响应创建一个表。我的问题是:
我刚刚开始对函数进行编码,并且有类似的东西,是的,我是JS和jQuery的新手:
$(document).ready(function() {
$("form").submit(function(){
event.preventDefault();
$.ajax({
//type: "POST",
url: "./trains_bw_stations.php",
dataType: 'json',
data: { source: $('input[name*="src"]').val(), destination: $('input[name*="dstn"]').val(),
day: $('input[name*="day"]').val(), month: $('input[name*="month"]').val(), cl: $('input[name*="cl"]').val() }
})
.done(function(trains) {
console.log(trains)
var requests = [], allData = {};
for (var i = 0; i < trains.length; i++) {
console.log(trains[i][0]);
requests.push($.ajax({
url: './availability.php',
dataType: 'json',
data: {
day: $('input[name*="day"]').val(), month: $('input[name*="month"]').val(),lccp_trndtl: trains[i][0] }
// success: function(data) {
// console.log(data);
// allData[''+i] = data;
}).done(function(data) {
console.log(data);
allData[i] = data})
);
}
$.when.apply(requests).then(function() {
console.log(allData) // this is line 41
}
// all requests have completed
// allData array now contains the data from all the requests
// put your processing logic in here...
});
});
});
});
allData仍为空!控制台输出:
XHR finished loading: GET "http://localhost/irl_poster/trains_bw_stations.php?source=ndls&destination=hyb&day=7&month=8&cl=SL". jquery-2.1.1.min.js:4
[Array[15], Array[15], Array[15]]
ajaxRequests.js:19
12650NZM KCG YYYNYNYYA ajaxRequests.js:23
12724NDLSHYB YYYYYYYYA ajaxRequests.js:23
12722NZM HYB NYYYYYYYA ajaxRequests.js:23
Object {} ajaxRequests.js:41
XHR finished loading: GET "http://localhost/irl_poster/availability.php?day=7&month=8&lccp_trndtl=12650NZM+KCG+YYYNYNYYA". jquery-2.1.1.min.js:4
Object {0: Array[4], 2: Array[4], 4: Array[4], 6: Array[4], 8: Array[4], 10: Array[4]}
ajaxRequests.js:34
XHR finished loading: GET "http://localhost/irl_poster/availability.php?day=7&month=8&lccp_trndtl=12724NDLSHYB+YYYYYYYYA". jquery-2.1.1.min.js:4
Object {0: Array[4], 2: Array[4], 4: Array[4], 6: Array[4], 8: Array[4], 10: Array[4]}
ajaxRequests.js:34
XHR finished loading: GET "http://localhost/irl_poster/availability.php?day=7&month=8&lccp_trndtl=12722NZM+HYB+NYYYYYYYA". jquery-2.1.1.min.js:4
Object {0: Array[4], 2: Array[4], 4: Array[4], 6: Array[4], 8: Array[4], 10: Array[4]}
答案 0 :(得分:2)
您的$.when.apply
电话中有错误 - 它需要一个初始上下文参数,通常为$
您的代码也遇到了在异步回调中使用循环变量i
的常见问题,此时它不再保留其原始值,结果都以allData[trains.length + 1]
因此,您可以完全删除allData[i]
来电,而不是尝试在.done
回调中累积.done
,然后在.when().then()
回调中您可以使用{ {1}}数组用于访问单个结果,这些结果将自动以正确的顺序显示:
arguments
使用$.when.apply($, requests).then(function() {
// convert the arguments array, where each argument is in the form
// [data, textStatus, jqXHR], into an array of just the data values
var allData = [].map.call(arguments, function(arg) {
return arg[0];
});
...
});
:
Array.prototype.map
答案 1 :(得分:1)
你是正确的,你需要使用$.when
,虽然你的语法有点偏。试试这个:
.done(function(json) {
var requests = [], allData = [];
// loop over your result, amend as needed
for (var i = 0; i < json.length; i++) {
requests.push($.ajax({
url: 'foo.html', // build as needed using properties of json
success: function(data) {
allData.push(data);
}
}));
}
$.when.apply(requests).then(function() {
// all requests have completed
// allData array now contains the data from all the requests
// put your processing logic in here...
});
});
如果您需要维护收到的数据的顺序,可以将allData
变量更改为一个对象,由循环索引键入:
// note: amended lines only
var requests = [], allData = {};
success: function(data) {
allData[i] = data;
}