2011-12-19 48 views
1

这可能很明显,但我无法弄清楚。如何使函数返回它的内函数的值?

我需要使函数返回它的内函数的值。换句话说,我有必须返回JSON对象的函数get_users()。该JSON对象由$.post(内置jQuery)获取。

function get_users() {  
    return 
     $.post(
      url_base + 'travel/trip/get_users/' + trip_id, 
      function(response) {  
       return response;  
      }, 
      'json' 
     );  
} 

(以上是我试图这样做,但它返回undefined - 一个惊喜)

由于变量的作用域的,我不能只让变量内部函数,因为它是不可见的在主要功能。我不想使用全局变量。寻找更好的解决方案!

谢谢你的任何建议!

+0

'post'是异步的,因此你不能像你想要做的那样返回值。如果你真的需要这个,尽管我没有建议它,请将ajax调用设置为同步[async:false](http://api.jquery.com/jQuery.ajax/)。 – Yoshi 2011-12-19 08:54:37

+1

这不是一个简单的范围界定问题。 AJAX调用是异步的。这里发生的是1.您调用get_users,它发送一个Ajax请求。 get_users现在完成。 2.在不久的将来,这个AJAX请求被返回,并且你指定的回调函数被运行(在这种情况下,你的回调没有做任何特别有趣的事情)。 – Asmor 2011-12-19 08:56:57

回答

2

您需要了解异步ajax调用的工作原理。

当您拨打$.post()时,它会启动网络电话进行发布,并立即从$.post()呼叫返回并继续执行其余的javascript。它甚至会立即退出你的功能get_users()

但是,ajax调用还没有完成 - 它仍在进行中。一段时间后,ajax调用将完成,当发生这种情况时,将调用您定义为function(response) {...}的ajax调用的成功处理程序。只有在那个时候,才会有来自已知的ajax调用的响应值。

这就是异步ajax的意思。你不能写一个像get_users()这样的调用,并期望它获得用户并随它们一起返回。相反,你必须利用回调函数,这些函数稍后会调用(当ajax完成时),然后你可以继续代码的路径。是的,这很不方便,但这是javascript与异步ajax调用一起工作的方式。异步ajax调用的好处在于,在ajax调用正在进行时,浏览器和其他javascript代码可以完全处于活动状态。异步ajax调用的代价是编码更复杂。

对于如何处理这种并发症,您有多种选择。首先,您可以调用get_users(),然后继续在get_users()内部回调中执行的编程序列,因为这是响应(实际用户)唯一知道的地方。如果你只在代码中的一个地方使用get_users(),那么这可以很好地工作。当Ajax调用

function get_users() { 
    $.post(
     url_base + 'travel/trip/get_users/' + trip_id, 
     function(response) { 

      // process the user list here and continue whatever other code you 
      // need that deals with the user list 
     }, 
     'json' 
    ); 
} 

如果您需要在几个不同的地方为了不同的目的使用get_users(),那么你可以改变它采取回调本身,让后期的调用只是调用回调函数:它是这样的已经完成了。这样,你会完成处理在回调函数的响应:

function get_users(callback) { 
    $.post(
     url_base + 'travel/trip/get_users/' + trip_id, 
     callback, 
     'json' 
    ); 
} 

在这第二个选项,你可以调用get_users()这样的:

get_users(function(response) { 
    // process the user list here and continue whatever other code you 
    // need that deals with the user list 
}); 

还有更先进的可使用jQuery's deferred object选项。

5

你为什么要对抗AJAX的异步性?当你做AJAX时,你应该习惯于使用事件和回调,而不是编写顺序代码。你不能返回内部内容。这样做的一个简单的原因是,这个内部函数可能比外部函数执行晚得多。所以外部函数会在执行成功回调之前返回一个结果。

所以这里的正确方法:

function get_users() { 
    $.post(
     url_base + 'travel/trip/get_users/' + trip_id, 
     function(response) { 
      // instead of trying to return anything here 
      // simply do something with the response 
      // Depending on what the server sent you there 
      // will be different ways. 

      // Here you could also call some other custom function 
      // and pass it the response 
     } 
     'json' 
    ); 
} 
+0

我只是在学习...一个例子将不胜感激。 – daGrevis 2011-12-19 08:54:48

+0

@daGrevis,当然,我已经用一个例子更新了我的答案。 – 2011-12-19 08:57:49

3

无法从Ajax调用返回值。 (如果不设置异步错误,但不会真的是AJAX)

通过你打内部返回时,外功能已经完成

您将需要使用一个回调来处理用户。

get_users(function(response) { // this anonymous function is passed in as a parameter 
    // do something with the response 
}); 

function get_users(callback) { 
    $.post(
     url_base + 'travel/trip/get_users/' + trip_id, 
     function(response) { 
      // call the passed in function and pass in the response as a parameter 
      callback(response);  
     }, 
     json' 
    ); 
} 
+0

如果不需要额外的工作*,可以直接使用'callback',而不用第二个匿名函数。 :) – Yoshi 2011-12-19 09:12:40