2012-09-13 37 views
1

我有一个问题,将数据从一个JQuery ajax调用传回到调用位置。在考虑中的代码如下:将jQuery ajax值传递回调用JavaScript函数

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:"https://stackoverflow.com/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; 
     }) 
    }); 

任何指针是非常感谢

+2

[jQuery ajax请求内部函数的可能重复:如何返回我得到的值?](http://stackoverflow.com/questions/3619888/jquery-ajax-request-inside-a-function-how-返回值我得到) – bfavaretto

回答

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: "https://stackoverflow.com/users/update/" + user_id, 
     type: "GET", 
     success: callback 
    }); 
} 

在这里,你调用的AJAX调用的成功处理程序回调,因此现在可以访问数据这是由AJAX调用返回的。

+0

相当类似于我的:P击败你一拳打了10秒 – Mutmatt

+0

为什么downvote?如果你打算至少解释原因。 –

+0

1.因为你强迫它是同步的,2.因为它不使用'Deferred'模式来处理这个场景。 3.你可能刚刚说过'成功:回调'没有额外的关闭。 – Alnitak

1

Ajax中的A是异步的,这意味着文件的加载时,启动它的功能完成运行。尝试使用jQuery的递延: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:"https://stackoverflow.com/users/update/"+user_id, 
     type:"GET", 
     async: false, 
     success: (function(data){   
      ... 
     }) 
    }); 
} 
+1

关闭,除了不需要创建一个新的'Deferred'对象 - '$ .ajax()'函数为您创建一个。 – Alnitak

+0

工作就像一个魅力感谢史蒂夫,@Alnitak我怎样才能从jQuery.ajax()函数使用Deferred对象,而无需创建一个新的Deferred对象? – raphie

+1

@raphie只是在这个答案中消除了'defer'变量,并且chnage函数使得它返回jQuery.ajax(...)'。 – Alnitak

0

调用成功函数是Ajax请求,而不是UpdateUser两个函数的函数。所以很显然,当你返回它将返回成功回调,但不会返回到UpdateUser函数..

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

-2

相当肯定发生了什么(不是专家),但你在成功的annonomys返回“数据”功能,而不是你的整个UpdateUser两个功能

function updateUser(user_id) 
{  
    var retData; 
    jQuery.ajax({ 
     url:"https://stackoverflow.com/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; 
}); 

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

1

有你的功能return调用的结果jQuery.ajax() - 这个对象实现了jQuery推迟promise接口。也就是说,一个对象承诺在一段时间后返回

function updateUser(user_id) {  
    return jQuery.ajax({...}); 
} 

,然后用.done()注册功能时的承诺得到resolved被称为:

updateUser(data[i]).done(function(result) { 
    alert(result); 
}); 

的重要组成部分,是deferred对象让你完成脱钩异步的开始任务(即您的updateUser函数)与该任务完成(或失败)时应该发生的情况。

因此没有必要通过任何回调函数来.ajax,你也可以链其他递延对象呼叫(如动画,其他AJAX请求)。

此外,您可以根据自己的喜好和.fail()回调登录尽可能多的回调,而无需更改updateUser()