2012-06-18 3 views
0

Кто-нибудь знает способ заставить эту функцию ajax работать без отключения async? Asynx = ложные замерзает все вверх ...jQuery bValidator issue - async

<script type="text/javascript"> 
    $(document).ready(function() { 
     $('#form5').bValidator(); 
    }); 

    function checkUsername(username){ 

     var ret = false; 

     $.ajax({ 
      type: 'POST', 
      url: 'checkuser.php', 
      sync: false, // Want to remove this 
      data: {'username':username}, 
      success: function(data){ 
       if(data == 'ok') 
        ret = true 
      } 
     }); 

     return ret; 
    } 
</script> 
<form id="form5" method="post"> 
    <p> Choose username: 
     <input type="text" data-bvalidator="checkUsername,required" data-bvalidator-msg="This username is not valid or already taken."> 
    </p> 
    <p> 
     <input type="submit" value="Submit"> 
     <input type="reset" value="Reset"> 
    </p> 
</form> 

http://karmela.fsb.hr/~bmauser/bvalidator/documentation.html#serversidevalidation

ответ

-1

вам не хватает некоторого понимания концепции AJAX. это называется «асинхронным» по причине.
если вы удалите async: false (и вы должны, в противном случае это не действительно ajax), то запрос для 'checkuser.php' выполняется асинхронно. это означает, что сценарий продолжает выполнение, и тем временем в «фоновом режиме» выполняется запрос ajax.
, когда он будет завершен, выполняется функция обратного вызова 'success' (всякий раз, когда это происходит, вы не можете быть уверены).
поэтому, если вы хотите, чтобы что-то произошло только после того, как запрос ajax был успешно завершен, вы должны поместить его в функцию «success».

в случае, если вы удалите async: false, то порядок исполнения заключается в следующем:

  1. вызова функции 'ложный RET ='
  2. запроса Ajax Invoke 'checkUsername'
  3. присвой (не ожидая его завершения)
  4. возвращающегося «RET»
  5. Аякса закончил это исполнение и 'успех() выполняет
  6. присвойте 'ret = true', но на данный момент 'ret' больше не существует.

понимать разницу между синхронной и асинхронной, выполнить следующие два примера:

Пример 1:

$.ajax({ 
    type: 'POST', 
    url: 'checkuser.php', 
    async: false, 
    data: {'username':username}, 
    success: function(data){ 
     alert('1'); 
    } 
}); 
alert('2'); 

Пример 2:

$.ajax({ 
    type: 'POST', 
    url: 'checkuser.php', 
    data: {'username':username}, 
    success: function(data){ 
     alert('1'); 
    } 
}); 
alert('2'); 

в «пример 1», вы будете предупреждены '1', а затем с '2'.
, но в примере «2» вы будете сначала предупреждены «2», а затем «1».
Это потому, что в примере 1 скрипт ожидает выполнения запроса ajax до его продолжения, но в примере 2 сценарий оставляет запрос ajax, запущенный в «фоновом режиме», и тем временем продолжает остальной части сценария.

надеюсь, что это прояснит.

+0

Я следовал примеру в документации bValidator. Я знаю, что он должен быть асинхронным, но я не могу заставить его работать вместе с bValidator. Не могли бы вы дать мне рабочий пример того, что вы имеете в виду? Я уже много часов общался с этим безрезультатно. – domino

+0

см. Редактирование на мой ответ. – EyalAr

+0

Я понимаю, как работает async, но я не могу заставить его работать с bvalidator ... – domino