这对你来说可能很明显,但我无法理解。
我需要创建返回其内部函数值的函数。换句话说,我有函数get_users()
必须返回JSON对象。该JSON对象由$.post
(内置jQuery)获取。
function get_users() {
return
$.post(
url_base + 'travel/trip/get_users/' + trip_id,
function(response) {
return response;
},
'json'
);
}
(以上是我试图做的,但它返回了undefined
- 这真是一个惊喜)
由于范围可变,我不能只在内部函数中创建变量,因为它在main函数中不可见。我也不想使用全局变量。寻找更好的解决方案!
感谢任何建议!
答案 0 :(得分: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'
);
}
答案 1 :(得分:3)
您无法从ajax调用返回值。 (没有设置async false,但那不是真正的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'
);
}
答案 2 :(得分: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()
,则可以正常工作。它看起来像这样:
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()
用于不同的目的,那么您可以将其更改为自己进行回调并让post调用在ajax调用完成时调用该回调。然后,您将在该回调函数中完成对响应的处理:
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可以获得更多高级选项。