我不清楚以下虚拟代码的返回值:
function foo()
var ret = 0;
var xhr=send_request( "bla", function() {
// do something with the AJAX response
// based on the value of response, var ret get set
} );
return ret;
}
我想要实现的是:基于AJAX响应,我可能会决定再次尝试请求。但无论如何,上面的函数总是返回0。
显然我可以让foo()函数决定在需要时调用send_request()两次,但它有点难看。有没有一种简单而好的方法来做到这一点?
由于
答案 0 :(得分:7)
您正在尝试同步进行ajax调用,但您正在进行异步调用。
重要的是要了解它的编写方式,代码不会等到AJAX调用完成后再转到下一行。因此,它始终返回ret
的初始值。
要做好几件事来解决这个问题:
应该是这样的:
function foo()
var ret = $.ajax({ url: "blah",
async: false
}).responseText;
// do your stuff here
return ret;
}
编辑:可以通过异步调用执行此操作,但您必须调整您对问题的思考方式。而不是考虑返回值,你必须考虑回调函数。
为了举例,我想说我正在尝试获取用户的名字并将其放在页面上。我的代码看起来像这样:
function GetUsername() {
$.ajax( { url: "blah",
success: PopulateUsername // Specify a callback
});
// I don't do anything else. Execution will continue when the
// callback gets called from the AJAX call.
}
function PopulateUsername(data) {
alert(data);
// Anything else I want to do, I do here, because it is only
// here that I have access to the result.
}
GetUsername(); // I call GetUsername() here, and that's it. Any
// further actions that need to happen are going to
// occur in the callback function
答案 1 :(得分:0)
变量ret
在函数中具有局部范围。因此,每次调用它时,变量都会初始化为0。
此外,当函数返回变量ret
时,send_request
函数(将其他东西设置为ret
)尚未运行,因为返回的值始终为0必须在函数返回后,ajax请求完成,send_request
函数将新值设置为ret
。
答案 2 :(得分:0)
如果您想保持同步,请使用Stargazer712的建议。
您可以尝试使用以下内容保持异步:
function foo(callback)
var xhr=send_request( "bla", function(result) {
callback(result)
} );
}
function test(result) {
// test result here
if(result != "what I want")
foo(test); // repeat the ajax call under certain conditions
else
alert("got it");
}
$(function() {
foo(test);
});
这将重复ajax请求,直到响应与某个值匹配。
答案 3 :(得分:0)
您不希望从将要进行AJAX调用的函数返回一个值,因为在函数返回之前AJAX请求将不会完成(并且个人而言,我不同意您应该将异步设置为异步的答案)假)。你想做这样的事情:
function retFunction(val) {
// Do something here for various values of val
if (val == 0) {
// Something
} else if (val == 1) {
// Something else
}
}
function foo()
var xhr=send_request( "bla", function() {
var myResult = 0; // Something here based on return values.
retFunction(myResult);
});
}