将jQuery ajax值传递回调用JavaScript函数

时间:2012-09-13 20:49:00

标签: javascript jquery ajax

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

非常感谢任何指针

5 个答案:

答案 0 :(得分:5)

您不能从这样的AJAX成功处理程序返回值。 AJAX是异步的,因此执行将继续执行resultundefined的下一行。从异步操作中获取数据的唯一方法是使用回调。回调函数是在异步操作完成它正在执行的操作时调用的函数:

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;
});

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