2011-07-28 166 views
2

我希望得到解决的任何建议。在Javascript中按顺序执行命令

我正在使用JS函数checkAvailability()来确认一个组是否可用于添加到数据库。 (由于某些原因,数据库密钥约束不适用) 执行此操作时,有时我的函数甚至会在从PHP文件接收输出之前返回。

所以我得到了一个混合的结果。当收到来自PHP文件的输出时,它显示正确的结果。但其余时间它只是返回假。

任何关于如何解决这个问题的指针? 代码如下:

谢谢, Vish

//函数来检查组名可用性

function checkAvailability(){ 
     var grpname = $('#groupname').val(); 
     var isAvailable = false 

     //use ajax to run the check 
     $.post("checkGroupName.php", { gname: grpname }, 
      function(result){ 
       if(Number(result) == 0){ 
        //show that the groupname is available 
        isAvailable = true ; 
        $('#username_availability_result').html(grpname + ' is Available'); 
       } 
       else{ 
        //show that the groupname is NOT available 
        isAvailable = false ; 
        $('#username_availability_result').html(grpname + ' is already taken'); 

       } 
     }); 

    alert("isAvailable : "+isAvailable); 
    return isAvailable ; 
} 

checkGroupName.php文件

$gname = $_POST['gname']; 
$query = "SELECT * FROM groups WHERE group_name='$gname'"; 
$result = mysql_query($query); 
if(mysql_num_rows($result)){   
    echo 1; 
else 
    echo 0; 
+5

我肯定喜欢能够在您的应用程序运行的SQL注入攻击! –

+0

为什么你不想比较结果作为字符串?如果(结果=='0'){... – heximal

+0

用户:Re @ Delan的评论,这是一个真正的问题,你会想要在你的代码中处理。更多:http://en.wikipedia.org/wiki/Sql_injection –

回答

0

问题是$.post发送异步请求和其他鳕鱼的请求e在从服务器到达响应之前执行。

解决方法是使用$.ajax()并将async选项设置为false,以使该呼叫同步。是这样的:

function checkAvailability(){ 
     var grpname = $('#groupname').val(); 
     var isAvailable = false 

     //use ajax to run the check 
     $.ajax({ 
       type: 'post', 
       url: 'checkGroupName.php', 
       dataType: 'json', 
       data: { gname: grpname }, 
       async: false, 
       success: function(result){ 
        if(Number(result) == 0){ 
        //show that the groupname is available 
        isAvailable = true ; 
        $('#username_availability_result').html(grpname + ' is Available'); 
       } 
       else{ 
        //show that the groupname is NOT available 
        isAvailable = false ; 
        $('#username_availability_result').html(grpname + ' is already taken'); 

       } 
     }); 

    alert("isAvailable : "+isAvailable); 
    return isAvailable ; 
} 
+0

当没有其他选项时,同步ajax调用应该是最后的手段。几乎总是有。 – JJJ

+0

我认为提供所有选项是正确的。这一切都取决于OP的需求,我不认为我的回答是不正确的,我认为还有其他选择(当然更好,但需要更多的代码重构)。 –

4

你的函数应该总是您的Ajax请求PHP页面完成前返回,因为Ajax请求是异步。您开始它在您的功能,但它完成后,网络操作完成。 .post不会阻止等待结果。

您可以通过使用.ajax而不是.postasync: false选项来阻止,但在许多浏览器上,在网络请求期间以不愉快的方式锁定用户界面。

相反,有你的函数接受一个回调,它将与操作的结果称:

function checkAvailability(callback) { 
    var grpname = $('#groupname').val(); 

    //use ajax to run the check 
    $.post("checkGroupName.php", { gname: grpname }, 
     function(result){ 
      if(Number(result) == 0){ 
       //show that the groupname is available 
       $('#username_availability_result').html(grpname + ' is Available'); 
       callback(true); 
      } 
      else{ 
       //show that the groupname is NOT available 
       $('#username_availability_result').html(grpname + ' is already taken'); 
       callback(false); 
      } 
    }); 
} 

代码,用来做:

doSomething(); 
if (checkAvailability()) { 
    itsAvailableLetsDoSomething(); 
    moreAvailableStuff(); 
} 
else { 
    itsNotAvailableDoSomethingElse(); 
    otherStuff(); 
} 

...反而会看像这样:

doSomething(); 
checkAvailability(function(available) { 
    if (available) { 
     itsAvailableLetsDoSomething(); 
     moreAvailableStuff(); 
    } 
    else { 
     itsNotAvailableDoSomethingElse(); 
     otherStuff(); 
    } 
}); 

正如你所看到的,影响是最小的,但通过这样做,你正在异步通信的优点,以保持您的UI响应。

0

你可以试试这个代码

功能checkAvailability(){

var grpname = $('#groupname').val(); 
    var isAvailable = false 
    $.ajax({ 
     type: "POST", 
     url: "checkGroupName.php", 
     data: {grpname : grpname }, 
     success: function (result) { 
     if(Number(result) == 0){ 
       //show that the groupname is available 
       isAvailable = true ; 
       $('#username_availability_result').html(grpname + ' is Available'); 
      } 
      else{ 
       //show that the groupname is NOT available 
       isAvailable = false ; 
       $('#username_availability_result').html(grpname + ' is already taken'); 

      }} 
    }); 

}