2010-06-23 6 views
5
$(document).ready(function(){ 
//global vars 
var name = $("#username"); 
    var email = $("#email"); 


function usernameExists() { 
    $.get("register.php",{ check: 1, username: name.val(), email: email.val() } ,function(m) { 
     if(m==1) { 
    return false; 
    } else { 
    return true; 
    } 
    }); 
} 
}); 

Firebug показывает правильный ответ, когда эта функция вызывается, однако она ничего не возвращает ... (эта функция $ .get (...) была проверена вне функции usernameExists(), но без возвратов, и он отлично работал).jQuery получить функцию для возврата true/false

В чем проблема и как ее решить?


 $(document).ready(function(){ 
    //global vars 
    var form = $("#register"); 
    var name = $("#username"); 
    var email = $("#email"); 

    $.get("register.php", 
      { check: 1, username: name.val(), email: email.val() }, 

       // Have this callback take care of the rest of the submit() 
      function(m) { 
       if(m==1) { 
        form.submit(function(){ return false; }); 
       } else { 
        form.submit(function(){ 
     if(validateName() & validateEmail() & validatePass1() & validatePass2()) 
      return true 
     else 
      return false; 
       }); 
      } 

     } 
    ); 

function validateName(){ 
     // some check here 
    } 

// and other functions 

}); 

ответ

8

Функция вы вызываете ничего не возвращает.

Даже если он попытался вернуть ответ от вашего $.get(), это не сработает, потому что вызов является асинхронным, поэтому к моменту получения ответа какой-либо код, который использовал бы возвращаемое значение, скорее всего, уже казнены.

Что вам нужно сделать, это позвонить вашему коду из обратного вызова $.get().

function usernameExists() { 
    $.get("register.php",{ check: 1, username: name.val(), email: email.val() } ,function(m) { 
      someOtherFunction(m==1); 
    }); 
} 

function someOtherFunction(parameter) { 
    // The parameter will be true or false 
    // depending on the value of m==1 
} 

обновляется на основе вашего комментария.

Наверное, лучше всего привести $.get() в submit(), но с учетом оригинальной идеи, вот как он мог выглядеть.

form.submit(function(){ 
     // After usernameExists() is called, we need to hand off 
     // the rest of the execution to that function since 
     // this one will be done executing before the get() 
     // response is received 
    usernameExists(); 
    return false; 
}); 

function usernameExists() { 
    $.get("register.php", 
      { check: 1, username: name.val(), email: email.val() }, 

       // Have this callback take care of the rest of the submit() 
      function(m) { 
       if(m==1) { 
        // do something if true 
       } else { 
        // do something if false 
       } 
      } 
    ); 
} 

Объяснение радостей синхронного против Asynchronous JavaScript

код Javascript обычно выполняется синхронно. Это означает, что он выполняет только одну строку за раз, или одна строка должна закончить выполнение до того, как будет запущена следующая строка.

var greeting = "hi there"; // set the greeting variable 

alert(greeting); // the alert won't fire, 
        // until the previous line finished successfully 

Это делает вещи очень приятными и предсказуемыми. Но есть некоторые исключения из этого правила. Одним из примечательных исключений является вызов AJAX.

Ваш $.get() является примером вызова AJAX. «A» в AJAX означает асинхронность, что означает, что он не предотвращает выполнение следующей строки кода.

Ветвление в том, что когда вы делаете $.get(), который принимает (например) 1 секунды, независимо от кода пришли после того, как $.get() уже давно закончил к тому времени $.get() получил свой ответ.

Возьмите предыдущий пример greeting, но на этот раз с помощью AJAX.

var greeting; // will hold the response from our AJAX call 

$.get('some/path/to/data.php', 
     function(m) { 
      greeting = m; // populate the greeting variable with the data returned 
     } 
); 

alert(greeting); // Will alert "undefined" instead of the data that was returned 
        // because the $.get() code above is asynchronous, which allows 
        // the code below it (the alert in this case) to continue 
        // executing. 

Как вы можете видеть, alert(greeting) бы выполнены задолго до $.get() был получен ответ, потому что он $.get() является асинхронным, и не останавливается цепочку выполнения в то время как он ждет своих данных.

Чтобы решить эту проблему, вы бы на месте alert()внутри обратного вызова для $.get(), так что он не будет работать, пока не будет получен ответ.

var greeting; // will hold the response from our AJAX call 

$.get('some/path/to/data.php', 
     function(m) { 
      greeting = m; // populate the greeting variable with the data returned 
      alert(greeting); // Now the alert will give the expected result 
           // because it is in the callback. 
     } 
); 

Получается, что в вашем коде, когда вы звоните $.get(), оставшийся код, который зависит от ответа, полученного должно происходить внутри функции обратного вызова.

Единственный способ разместить свой код вне обратного вызова будет поместить его в своей собственной функции, которая вызывается из внутри функций обратного вызова (как я сделал с моим оригинальным ответом).


Базовая схема, как ваш код должен работать:

Имейте в виду, что вам не обязательно нужна отдельная функция для usernameExists(). Вы можете поместить все, что код внутри submit()

form.submit(function() { 
     // Check to make sure input is valid **before** you send the AJAX 
    if(validateName() & validateEmail() & validatePass1() & validatePass2()) { 
     usernameExists(); // If valid, continue with the usernameExists() 
    } 
    return false; // We return false whether or not the content was valid, 
        // in order to prevent the form from submitting prematurely 
}); 

function usernameExists() { 
    $.get("register.php", 
      { check: 1, username: name.val(), email: email.val() }, 

       // Have this callback take care of the rest of the submit() 
      function(m) { 
        // If "m" is less than one, there were no existing users 
        // so we can go ahead and post the data to the server 
       if(parseInt(m) < 1) { 
        // Here, you would need to manually do a post to 
        // submit the data to the server 
        $.post(url, data, callback, datatype); 
       } 
      } 
    ); 
} 

http://api.jquery.com/jquery.post/

+1

@cthulhu - Это не будет работать, потому что 'usernameExists()' ничего не вернуть. И если это произошло, оператор 'if()' в '' submit() 'будет выполняться до получения ответа. В основном, что вам нужно сделать, это сохранить * любой и все * код, который зависит от ответа от вашего '$ .get()' внутри обратного вызова. Или вызовите другую функцию из обратного вызова, как и мой ответ. Я верну свой ответ другим решением. – user113716

+0

@cthulhu - вам нужно понять, что вы не должны * пытаться вернуть значение из функции 'usernameExists()'. Это просто не сработает. Вы должны выполнить оставшуюся часть вашего выполнения кода * внутри * этой функции. Если вы не понимаете, почему это так, дайте мне знать, и я буду рад дать вам другой пример, который может объяснить лучше. – user113716

+0

@cthulhu - Не проблема. : o) Я обновляю свой ответ через несколько минут с приведенным ниже примером, который более подробно описывает проблему. – user113716

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