2013-06-12 95 views
0

我正在尝试构建一些小函数,用于处理非常具体的事情并在处理程序中使用它们。 我正在尝试这样做,发送JSON对象到一个PHP脚本,然后以json对象的形式返回响应。jquery .done返回值 - 混淆

这是我写到目前为止功能:

function isRegistered(courseObj){ 
    var posting = $.post("is-user-registered.php", courseObj); 
    posting.done(function(data){ 
     var res = $.parseJSON(data); 
     if(res.response == "success"){ 
      return 0; 
     } else { 
      return 1; 
     } 
    }); 
} 

这是处理程序:

$('a.button.findDelegate').bind("click", function(){ 
    var textToSearch = $('#findUserBox').val(); 
    var txtObj = {}; 
    var courseObj = {}; 

    courseObj['courseId'] = $('input[name=courseId]').val(); 
    courseObj['email'] = txtObj['text'] = textToSearch; 

    if(txtObj['text'].length > 2){ 
     if(isRegistered(courseObj) === 0){ 
      console.log("search user and then add it to the list"); 
     } else { 
          console.log("this user is already registered lets throw an error"); 
        } 
    } 
    return false; 
}); 

的问题是,isRegistered总是返回undefined。 我几乎可以肯定,这与.done没有被直接执行有关,因为在Chrome浏览器undefined实际上是在ajax调用之前被记录的。

如果是这种情况,我该如何强制处理程序等待isRegistered响应?

我打开所有的建议,我可能使用错误的工具(jQuery)来做到这一点?

抱歉,缺乏清晰度。

+0

AJAX在默认情况下是异步的,你需要使用的要求回调函数的代码,根据这个 –

+0

的可能重复你的逻辑[如何返回从响应AJAX调用?](http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call) – gdoron

+0

我增加了更深入的答案您的问题。我的答案是帮助你还是应该删除它/ – gdoron

回答

1

done因为所有异步回调将在某个时间返回,也许会在1ms或10min内(并且一些回调永远不会像error\success那样激发)。

这意味着您只能在回调中使用这些值。

尝试的代码更改为类似:

function isRegistered(courseObj){ 
    var posting = $.post("is-user-registered.php", courseObj); 
    posting.done(function(data){ 
     var res = $.parseJSON(data); 
     if(res.response == "success"){ 
      // Do what's needed here ------------------------------ 
     } else { 
      // Do what's needed here ------------------------------ 
     } 
    }); 
} 
+0

我明白这一点,但这意味着我必须获得比他们需要的更多的功能。 以下面的代码为例: //处理程序1 if(isRegistered()=== true){ deleteUser(); } //处理程序2 if(isRegistered()=== true){ editUser(); } 如果我把代码放在那个需要做某些事情的函数中,那么我将不能很容易地重用这个函数:( –

+0

@AngeloMoreira,你可以用'if(res.response ==“成功“){DoSomething();} ...' – gdoron