我有以下JavaScript(和jQuery)代码:
function checkEmail(email) {
if (email.length) {
$.getJSON('ajax/validate', {email: email}, function(data){
if (data == false) {
// stuff
}
return data;
})
}
}
我希望匿名函数return data
到父函数checkEmail()
。我尝试过这样的事情:
function checkEmail(email) {
if (email.length) {
var ret = null;
$.getJSON('ajax/validate', {email: email}, function(data){
if (data == false) {
// stuff
}
ret = data;
})
return ret;
}
}
但当然这不起作用,因为$.getJSON()
调用是异步的,因此在GET请求完成之前它将return ret
。
这里有什么想法吗?
谢谢!
答案 0 :(得分:9)
通常,处理此类问题的最佳方法是使用某种形式的回调函数。实际上,它确实是唯一可行的解决方案 - 唯一的另一个选择是编写自己的浏览器扩展,这有点多(除非你真的喜欢用头撞墙)。这些板上实际上有很多平行的问题:你可能会尝试搜索一些,很多都非常好。
修改您的代码:
function checkEmail(email) {
/*
original parts of the function here!
*/
if (email.length) {
$.getJSON('ajax/validate', {email: email}, function(data){
if (data == false) {
// stuff
}
checkEmailResponse( data );
})
}
}
function checkEmailResponse( data )
{
// do something with the data.
}
答案 1 :(得分:3)
你也应该使用回调,因为调用是异步的,因此围绕这个想法设计整个JavaScript源代码(正如其他人指出的那样)。
如果你真的需要将它作为返回值,你需要关闭异步调用,但根本不建议这样做,因为它会阻止页面直到响应存在。
function checkEmail(email, callback) {
if (email.length)
return $.ajax({
data: {email: email},
url: 'ajax/validate',
async: false
}).responseText; // only the raw response text of the XMLHttpRequest
}
}
答案 2 :(得分:0)
你可以拥有父功能块,直到那里有东西。为了降低CPU密集度,可以使用somekind的超时。
function checkEmail(email) {
if (email.length) {
var ret = null;
$.getJSON('ajax/validate', {email: email}, function(data){
if (data == false) {
// stuff
}
ret = data;
})
while(ret == null){
}
return ret;
}
}
希望这有帮助。
答案 3 :(得分:0)
您只需要改变解决问题的方式。你知道你上面的东西是行不通的,所以你不能用“调用一个函数并按其返回值运算”来思考。
您需要切换到类似toby的CPS建议,或者根据触发此功能的内容,使用自定义事件处理它。