javaScript return Function with ajax
本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
jQuery: Return data after ajax call success
jQuery AJAX: return value on success
我无法弄清楚为什么
我确信这只是一个愚蠢的错误,我将非常感谢你的回答
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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调用肯定正在工作,data.aprovePassword肯定从servlet返回为"false"
因为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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仍未定义。
相反,你需要做这样的事情:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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); }}); } |
然后你会像这样调用函数:
1 2 3 | foo(function(goodPassword) { console.log('goodPassword is ' + goodPassword); }); |
在函数返回后发生ajax调用时,无法检查返回值。
要在成功和失败时执行两个操作,您需要执行以下操作: -
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | 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'); } ); |
或只有1个回调函数采用goodpassword的布尔值...