使用ajax的javaScript返回函数
可能重复:使用ajax的javaScript返回函数,javascript,ajax,return-value,Javascript,Ajax,Return Value,可能重复: 我不明白为什么goodPassword总是返回undefined 我相信这只是一个愚蠢的错误,我会感激你的回答 function foo(){ var goodPassword; jQuery.ajax({ data: "action=Potato", url: 'servletPotato', timeout: 2000, error: function() { consol
我不明白为什么
goodPassword
总是返回undefined
我相信这只是一个愚蠢的错误,我会感激你的回答
function foo(){
var goodPassword;
jQuery.ajax({
data: "action=Potato",
url: 'servletPotato',
timeout: 2000,
error: function() {
console.log("Failed to send ajax");
},
success: function(r) {
var data = jQuery.parseJSON(r);
if(data.aprovePassword == "true")
{
goodPassword = true;
}
else
{
goodPassword = false;
}
}
});
return goodPassword;
}
ajax调用确实在工作,数据也在传输中。ProvePassword从servlet返回时肯定是“false”,因为
goodPassword
还没有分配任何内容,因为XHR请求在函数结束后执行,这就是为什么在函数结束时没有分配任何内容。另一个函数是:
function foo(successCallback) {
var goodPassword;
jQuery.ajax({
data: "action=Potato",
url: 'servletPotato',
timeout: 2000,
error: function() {
console.log("Failed to send ajax");
},
success: function(r) {
var data = jQuery.parseJSON(r);
if(data.aprovePassword == "true")
{
goodPassword = true;
}
else
{
goodPassword = false;
}
successCallback(goodPassword);
}});
}
问题在于ajax请求是异步的,因此函数在启动jQuery.ajax调用后立即返回,此时goodPassword仍然未定义 相反,您需要这样做:
function foo(callback) {
var goodPassword;
jQuery.ajax({
data: "action=Potato",
url: 'servletPotato',
timeout: 2000,
error: function() {
console.log("Failed to send ajax");
},
success: function(r) {
var data = jQuery.parseJSON(r);
if(data.aprovePassword == "true") {
goodPassword = true;
} else {
goodPassword = false;
}
callback(goodPassword);
}});
}
foo(function(goodPassword) {
console.log('goodPassword is ' + goodPassword);
});
然后,您可以这样调用函数:
function foo(callback) {
var goodPassword;
jQuery.ajax({
data: "action=Potato",
url: 'servletPotato',
timeout: 2000,
error: function() {
console.log("Failed to send ajax");
},
success: function(r) {
var data = jQuery.parseJSON(r);
if(data.aprovePassword == "true") {
goodPassword = true;
} else {
goodPassword = false;
}
callback(goodPassword);
}});
}
foo(function(goodPassword) {
console.log('goodPassword is ' + goodPassword);
});
您不能检查返回值,因为ajax调用发生在函数返回之后 要执行两个操作,一个是成功,一个是失败,您需要执行以下操作:-
var foo = function(goodCallback, badCallback){
jQuery.ajax({
data: "action=Potato",
url: 'servletPotato',
timeout: 2000,
error: function() {
console.log("Failed to send ajax");
},
success: function(r) {
var data = jQuery.parseJSON(r);
if(data.aprovePassword == "true")
{
goodCallback();
}
else
{
badCallback();
}
}
});
};
foo(
function() {
console.log('dude good password');
},
function() {
console.log('bad password');
}
);
或者只有一个回调函数使用goodpassword的布尔值…因为javascript是单线程的,所以无论请求需要多长时间,foo都会在调用回调之前返回。@JonasH确定吗?由于它是单线程的,如果请求完成得足够快,它应该在函数e之前触发事件除了在jQuery中,我们还不知道场景后面会发生什么。在JS中,函数从不被抢占。XHR完成事件将被简单地添加到等待当前代码完成的事件队列中。jQuery不改变这一点,只是在XHR顶部添加了一个薄的抽象层。保护用户不受浏览器不兼容的影响