1

我在将数据从 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; 
        })
    });

非常感谢任何指针

4

5 回答 5

5

您不能像这样从 AJAX 成功处理程序返回值。AJAX 是异步的,因此执行将继续执行resultis的下一行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 调用返回的数据。

于 2012-09-13T20:52:37.533 回答
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){           
            ...
        })
    });
}
于 2012-09-13T20:51:14.113 回答
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().

于 2012-09-13T20:53:17.147 回答
0

调用成功函数的函数是 Ajax 请求,而不是 UpdateUser 函数。所以很明显,当你返回它时,它会从成功回调返回,但不会返回到 UpdateUser 函数。

此外,由于 ajax 是异步的,购买回调执行的时间,它将来自 UpdateUser 函数..!

于 2012-09-13T20:52:04.013 回答
-2

很确定发生了什么(不是专家),但是您正在成功地为您的 annonomys 功能返回“数据”,而不是您的整个 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;
});

但就像我说的,我不是专家。

于 2012-09-13T20:52:27.617 回答