我的代码如下
function lp(p, list, count) {
$.ajax({url: 'ajax.php', data: {id:p}, success: function (data) {
// the ajax output an image's url, based on the id p
if(p>count) {
return list;
} else {
lp(p+1, list+'<img src="' + data + '"><br>', count);
}
}})
}
alert(lp(1,"",5));
问题是,每当我运行代码时,“undefined”总是弹出
所以为了解开我的谜团,我添加了几行来调试我的代码,这就是我得到的
function lp(p, list, count) {
$.ajax({url: 'ajax.php', data: {id:p}, success: function (data) {
// the ajax output an image's url, based on the id p
if(p>count) {
alert("Done");
return list;
} else {
alert("Entering phase " + p);
lp(p+1, list+'<img src="' + data + '"><br>', count);
}
}})
}
alert(lp(1,"",5));
通过更改为此,结果变为“Undefined”,然后是“Entering Phase X”,然后是“Done”,这意味着第一个undefined由alert(lp)代码返回,之后它实际进入并解析递归函数内的所有数据。
有没有办法可以强制脚本在解析前等待AJAX完成?
编辑:我也尝试过更改
alert(lp(1,"",5));
到
list=lp(1,"",5);
alert(list);
当然,这不起作用
答案 0 :(得分:1)
您可以在函数中添加回调,如:
function lp(p, list, count, callback) {
$.ajax({url: 'ajax.php', data: {id:p}, success: function (data) {
// the ajax output an image's url, based on the id p
if(p>count) {
alert("Done");
callback(list);
} else {
lp(p+1, list+'<img src="' + data + '"><br>', count, callback);
}
}})
}
lp(1,"",5, function(data) {
alert(data);
});
当您的ajax请求完成时会触发alert(data);
答案 1 :(得分:0)
代码的问题是$ .ajax是一个异步函数。 Lp()将调用$ .ajax(),但是,不会立即调用成功回调。相反,你的代码将运行$ .ajax()然后到达你的Lp函数的底部(它不返回任何东西)。当服务器从ajax调用返回响应时,将触发成功回调(但是当时警报已经显示未定义。
最好的解决方案是在你的lp函数中传递一个回调函数,该函数会在调用成功时调用alert:
function lp(p, list, count, callback) {
$.ajax({url: 'ajax.php', data: {id:p}, success: function (data) {
// the ajax output an image's url, based on the id p
if(p>count) {
callback(list);
} else {
lp(p+1, list+'<img src="' + data + '"><br>', count, callback);
}
}})
}
alert(lp(1,"",5), function(list) {
console.log(list);
});