我在将数据从JQuery ajax调用传递回调用位置时遇到问题。有问题的代码如下:
jQuery("#button").click(function()
{
for(var i = 0;i < data.length; i++)
{
result = updateUser(data[i]); //result is not populated..
alert(result); //prints 'undefined'
}
});
function updateUser(user_id)
{
jQuery.ajax({
url:"/users/update/"+user_id,
type:"GET",
async: false,
success: (function(data){
//if I alert "data" here it shows up correctly
//but if i try to return it like below
//it does not get passed correctly
return data;
})
});
非常感谢任何指针
答案 0 :(得分:5)
您不能从这样的AJAX成功处理程序返回值。 AJAX是异步的,因此执行将继续执行result
为undefined
的下一行。从异步操作中获取数据的唯一方法是使用回调。回调函数是在异步操作完成它正在执行的操作时调用的函数:
jQuery("#button").click(function () {
for (var i = 0; i < data.length; i++) {
updateUser(data[i], function(result) {
alert(result);
});
}
});
function updateUser(user_id, callback) {
jQuery.ajax({
url: "/users/update/" + user_id,
type: "GET",
success: callback
});
}
在这里,您在AJAX调用的成功处理程序中调用回调,因此您现在可以访问AJAX调用返回的数据。
答案 1 :(得分:1)
ajax中的A是异步的,这意味着当加载文件时,启动它的函数就完成了。尝试使用jQuery Deferred:http://api.jquery.com/category/deferred-object/
示例:
jQuery("#button").click(function()
{
for(var i = 0;i < data.length; i++)
{
updateUser(data[i]).done(function(result) {
alert(result); //prints 'undefined'
});
}
});
function updateUser(user_id)
{
return jQuery.ajax({
url:"/users/update/"+user_id,
type:"GET",
async: false,
success: (function(data){
...
})
});
}
答案 2 :(得分:1)
让函数return
调用jQuery.ajax()
的结果 - 该对象实现了jQuery延迟promise
接口。也就是说,一个承诺稍后返回结果的对象。
function updateUser(user_id) {
return jQuery.ajax({...});
}
然后使用.done()
注册当promise获得resolved
时要调用的函数:
updateUser(data[i]).done(function(result) {
alert(result);
});
重要的一点是,deferred
个对象允许您完成异步任务(即您的updateUser
函数)的发起与该任务应该发生的事情的分离完成(或失败)。
因此,无需将任何回调函数传递给.ajax
,您也可以将调用与其他延迟对象(例如动画,其他AJAX请求)链接起来。
此外,您可以根据需要注册尽可能多的.done()
个回调,也可以注册.fail()
个回调,而无需更改updateUser()
。
答案 3 :(得分:0)
调用success函数的函数是Ajax请求,而不是UpdateUser函数。很明显,当你返回它时,它将从成功回调返回,但不返回到UpdateUser函数..
此外,由于ajax是异步的,所以购买回调执行的时间它将来自UpdateUser函数..!
答案 4 :(得分:-2)
非常确定发生了什么(不是专家),但是您正在为您的annonomys功能成功返回'data'而不是整个updateUser函数
function updateUser(user_id)
{
var retData;
jQuery.ajax({
url:"/users/update/"+user_id,
type:"GET",
async: false,
success: (function(data){
//if I alert "data" here it shows up correctly
//but if i try to return it like below
//it does not get passed correctly
retData = data;
})
return retData;
});
但就像我说的那样,我不是专家。