Функция вы вызываете ничего не возвращает.
Даже если он попытался вернуть ответ от вашего $.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/
@cthulhu - Это не будет работать, потому что 'usernameExists()' ничего не вернуть. И если это произошло, оператор 'if()' в '' submit() 'будет выполняться до получения ответа. В основном, что вам нужно сделать, это сохранить * любой и все * код, который зависит от ответа от вашего '$ .get()' внутри обратного вызова. Или вызовите другую функцию из обратного вызова, как и мой ответ. Я верну свой ответ другим решением. – user113716
@cthulhu - вам нужно понять, что вы не должны * пытаться вернуть значение из функции 'usernameExists()'. Это просто не сработает. Вы должны выполнить оставшуюся часть вашего выполнения кода * внутри * этой функции. Если вы не понимаете, почему это так, дайте мне знать, и я буду рад дать вам другой пример, который может объяснить лучше. – user113716
@cthulhu - Не проблема. : o) Я обновляю свой ответ через несколько минут с приведенным ниже примером, который более подробно описывает проблему. – user113716