我对AJAX调用有疑问,无法将响应提供给主函数。现在,我使用异步false,我知道这很奇怪,我尝试解决它,但始终失败。
这有效(异步为false):
function printTable(){
var $table = $('#Table');
var view_data;
$.ajax({
type: "GET",
url: '/api/getdata',
success: function(response) {
var TableData = [];
for(var i =0;i < response.length ;i++){
var item = response[i];
var sessionID = item.sessionID;
if(sessionID){
$.ajax({
async: false,
type: "POST",
url: '/api/getNickname',
dataType: "json",
data: {
id: sessionID,
},
success: function(response){
view_data = response;
}
});
}
TableData.push({
_id: item._id,
datum: item.datum,
uhrzeit: item.uhrzeit,
session: view_data,
});
}
$table.bootstrapTable({data: TableData});
$table.bootstrapTable('togglePagination');
}
})
}
我从这里尝试了建议:Assigning ajax response to global variable without using async: false,但是由于view_data未定义,所以它失败了。
function printTable(){
var $table = $('#Table');
var view_data;
$.ajax({
type: "GET",
url: '/api/getdata',
success: function(response) {
var TableData = [];
for(var i =0;i < response.length ;i++){
var item = response[i];
var sessionID = item.sessionID;
if(sessionID){
$.ajax({
type: "POST",
url: '/api/getNickname',
dataType: "json",
data: {
id: sessionID,
}
}).done(function(response){
test(response)
});
function test(response){
view_data = response;
return view_data;
}
}
}
TableData.push({
_id: item._id,
datum: item.datum,
uhrzeit: item.uhrzeit,
session: view_data,
});
}
$table.bootstrapTable({data: TableData});
$table.bootstrapTable('togglePagination');
}
})
}
我意识到的是如果我放了alert(view_data);在推送之前有效!?我对JS / AJAX的了解还不是那么深入,所以我希望有人可以给我提示或帮助。 如何在不使用异步false的情况下将var view_data传递给主函数?
谢谢...
答案 0 :(得分:0)
这与异步代码有关
当您指定async: false
时,就是在告诉代码等待,直到此HTTP调用完成。
但是如果没有async: false
,您的http调用将被异步进行,即程序将继续执行,而无需实际等待HTTP调用完成,并且您的success
函数仅在HTTP时执行返回呼叫响应
这将需要2 3秒钟,但是您正在访问当时未定义的view_data。
您可以做的是将push
代码移到success
函数中:
函数printTable(){ var $ table = $('#Table');
var view_data;
$.ajax({
type: "GET",
url: '/api/getdata',
success: function(response) {
var TableData = [];
for(var i =0;i < response.length ;i++){
var item = response[i];
var sessionID = item.sessionID;
if(sessionID){
$.ajax({
async: false,
type: "POST",
url: '/api/getNickname',
dataType: "json",
data: {
id: sessionID,
},
success: function(response){
view_data = response;
TableData.push({ // <- like this
_id: item._id,
datum: item.datum,
uhrzeit: item.uhrzeit,
session: view_data,
});
$table.bootstrapTable({data: TableData});
$table.bootstrapTable('togglePagination');
}
});
}
}
}
})
}
答案 1 :(得分:0)
这是JS异步时的情况,因此,当您使用async:false时,意味着下面的代码直到得到响应后才执行。 声明变量(view_data)->异步发送AJAX请求(您不等待响应)->摘录以下代码
声明变量(view_data)->同步发送AJAX请求(您等待响应)->分配对view_data的响应->摘录以下代码
所以您在ajax请求执行后将j查询写入成功并得到响应
function printCatchTable() {
var $table = $("#TableLastCaught");
$.ajax({
type: "GET",
url: "/api/lastcaught",
success: function(response) {
var faengeTableData = [];
for (var i = 0; i < response.length; i++) {
var item = response[i];
var sessionID = item.sessionID;
if (sessionID) {
$.ajax({
type: "POST",
url: "/api/getSessionNickname",
dataType: "json",
data: {
id: sessionID
},
success: function(response) {
//Keep Pushing on Array
faengeTableData.push({
_id: item._id,
datum: item.datum,
uhrzeit: item.uhrzeit,
fischart: item.fischart,
gewicht: item.gewicht,
laenge: item.laenge,
koeder: item.koeder,
montage: item.montage,
gewaesser: item.gewaesser,
temperatur: item.temperatur,
luftdruck: item.luftdruck,
bilder: fileNames,
edit: item._id,
session: response
});
//run jquery on last element
if(i === response.length){//if i === response.length, it means its final element so you run jquery table
$table.bootstrapTable({ data: faengeTableData });
$table.bootstrapTable("togglePagination");
}
}
});
}
}
}
});
}