您需要了解异步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选项。
'post'是异步的,因此你不能像你想要做的那样返回值。如果你真的需要这个,尽管我没有建议它,请将ajax调用设置为同步[async:false](http://api.jquery.com/jQuery.ajax/)。 – Yoshi 2011-12-19 08:54:37
这不是一个简单的范围界定问题。 AJAX调用是异步的。这里发生的是1.您调用get_users,它发送一个Ajax请求。 get_users现在完成。 2.在不久的将来,这个AJAX请求被返回,并且你指定的回调函数被运行(在这种情况下,你的回调没有做任何特别有趣的事情)。 – Asmor 2011-12-19 08:56:57