Задать вопрос
ddimonn8080
@ddimonn8080

Почему всегда возвращает undefined?

Здравствуйте, есть простая функция которая должна возвращать true либо false в зависимости от ответа сервера.
function mobileClassExist(className){
            $.ajax({
                url: 'styles-check.php',
                type: 'POST',
                data: {classNameToCheck: className},
                dataType: 'json',
                success: function(data, status, jqXHR){
                    console.log( 'data - ', data );
                    if (data) {
                        console.log( true );
                        return true
                    } else {
                        console.log( false );
                        return false;
                    }
                },
                error: function(jqXHR,status,error){},
            });
        }

        const re = mobileClassExist('test');
        const re2 = mobileClassExist('TPad0');
        console.log('re - ', re);
        console.log('re2 - ', re2);

вызов функции всегда возвращает undrfined хотя console.log внутри success выводит все правильно.
В чем ошибка?

Спасибо.
  • Вопрос задан
  • 140 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 5
v3shin
@v3shin
Веб-шаман
$.ajax - функция асинхронная, она выполняется отдельно от остального кода. Так что, код, зависящий от результатов ее выполнения, перенесите в success.
Ответ написан
Комментировать
john36allTa
@john36allTa
alien glow of a dirty mind
Параметр success у Вас содержит коллбэк функцию, которая вызывается только после успешного получения ответа от сервера. Т.е. return true / false она делает, но сама то функция вызывается не сразу и уже движком jquery, результат в ту область и отдается. Вообще почитайте про асинхронщину или сразу про промисы
Ответ написан
Комментировать
@ptvalx
Потому что $.ajax у вас работает асинхронно. Плюс к этому return в функции success вернёт результат в никуда.
Ответ написан
Комментировать
Seasle
@Seasle Куратор тега JavaScript
Потому что функция асинхронная. Варианта 2:
1. Передаете функцию обратного вызова
function mobileClassExist(className, callback) {
	$.ajax({
		...,
		success(data) {
			callback(data);
		}
	});
}

mobileClassExist(..., function (exists) {
	console.log(exists);
});

2. Используете Promise API и, опционально, async/await.
function mobileClassExist(className) {
	return new Promise(function (resolve, reject) {
		$.ajax({
			...,
			success(data) {
				resolve(data);
			},
			error(data) {
				reject(data);
			}
		});
	});
}

mobileClassExist(...)
	.then(function (exists) {
		console.log(exists);
	});
Ответ написан
Комментировать
E1ON
@E1ON Куратор тега JavaScript
Programming, Gamedev, VR
Используйте .then, так как вы вызываете асинхронную функцию
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы