2010-02-08 3 views
2

Я раздел всю логику из моего JQuery плагин для этого вопроса, но моя проблема в том, что, когда я называю функцию checkValidationName, он делает это дело и устанавливает имя = истину. Затем, когда я пытаюсь сравнить его сразу после того, как я его назвал, значение false. Почему это?JQuery плагин функция возвращает значения

(function($){ 
     $.fn.validate = function() {  

      var name = false; 

      $('.submitBtn').click(function() { 


       $.fn.validate.checkValidationName(nameValues); 


       **console.log("name = "+name); **//but this prints out "false"**** 
       //shouldn't this be true since name returned true in the actual function?? 


       } 
      }); 

      $.fn.validate.checkValidationName = function(id) { 
       $.post("PHP/submitButtonName.php", {checkValidation: id}, 
        function(data) { 

          **console.log("name = "+name); **//this prints out "true"**** 
          //name is equal to true here 

        }, "json"); 
      }; 

     }  
})(jQuery); 

ответ

1

Это потому, что запросы AJAX являются асинхронными и сразу после называется checkValidationName, она еще не закончена. Вам нужно выполнить сравнение в обратном вызове.

Вы можете сделать checkValidationName взять обратный вызов и вызвать его с результатом, когда подтверждено:

(function($){ 
    $('.submitBtn').click(function() { 
     $.fn.validate.checkValidationName(nameValues, function(valid) { 
      console.log(valid); 
     }); 
    }); 

    $.fn.validate.checkValidationName = function(id, callback) { 
     $.post("PHP/submitButtonName.php", {checkValidation: id}, 
      function(data) { 
       var valid = data.foo; // or however you determine that 

       callback(valid); // call callback 
      }, "json"); 
    }; 
}(jQuery)); 
+0

Есть ли способ сохранить значение имени и использовать его в другой функции? У меня есть 3 функции, похожие на checkValidationName, все с использованием разных переменных, и я хочу сравнить все переменные и выполнить операцию, если все три прохода действительны, а не только один. – Catfish

+0

Вы можете сделать что-то вроде http://pastie.org/817909. Если вам нужно что-то делать, если не все, действительно, вам нужно следить, сколько раз был назван doStuffIfAllValid(). – jou

1

Это потому, что вызов $ .post() в checkValidationName является асинхронным. При вызове следующей строки ...

$.fn.validate.checkValidationName(nameValues); 

Выполнение продолжается до следующей линии почти сразу же - задолго до того, вы получите результат сюда $ .post(), во всяком случае.

+0

Я попытался сделать $ .ajax с типом «POST» и установка асинхр: ложь, а не $ .post и что до сих пор не работает. – Catfish

Смежные вопросы