Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Области видимости (https://javascript.ru/forum/jquery/32679-oblasti-vidimosti.html)

project1 25.10.2012 13:58

Области видимости
 
Здрасти) Функция должна возвращать результат ответа, который содержится в переменной data безымянной функции.

function aliasExists(alias, args) {
	var ret = '123';
	$.get('/cp/ajax/alias_exists.php',
		{'alias': alias, 'args': args},
		function(data, textStatus) {
            alert(ret) //выведет 123
			ret = data;
            alert(ret) //выведет содерщимое data
		}
	);
    alert(ret) //выведет 123
	return ret;
}

Skipp 25.10.2012 14:11

Ну так правильно callback сработает, только тогда, когда сервер ответит, а return функцией будет возвращён сразу.

Поставьте таймер и выведете ret и посмотрите, что он вам покажет.

project1 25.10.2012 14:21

function aliasExists(alias, args) {
	var ret = '123';
	$.get('/cp/ajax/alias_exists.php',
		{'alias': alias, 'args': args},
		function(data, textStatus) {
			ret = data;
		}
	);
	setTimeout('alert(ret)', 2000);
	return ret;
}

Спустя 2 секунды пишет в консоле ошибок файрбага ReferenceError: ret is not defined

Skipp 25.10.2012 14:28

Первый параметр у setTimeout и setInterval это функция или же строка, содержащая имя функции.

(function(){
	var ret = 1;
	setTimeout(function(){
		alert(ret);
	}, 1000);
	ret = 2;
})()

А теперь, что бы было более понятнее, тут выводиться два alert теперь запусти и быстро закрой первый alert, потом посмотри значение второго, запусти второй раз и перед тем как закрыть первый, подожди две секунды и посмотри результат.
(function(){
	var ret = 1;
	setTimeout(function(){
		alert("setTimeout: " + ret);
	}, 2000);
	alert("function: " + ret);
	ret = 2;
})()

BallsShaped 25.10.2012 14:31

БЛЕАТЬ!!! Сколько можно! Одни и те же грабли! Учи основы!!!
Цитата:

setTimeout('alert(ret)', 2000);
Так верстаютпрограммируют только мудаки! Строка выполняется в глобальном скопе!

project1 25.10.2012 14:33

Работает, спасибо)
А как мне лучше реализовать мою функцию?
Через таймаут возвращать значение? - Как-то неверно...

Skipp 25.10.2012 14:36

BallsShaped,
Я смотрю ты сразу кулхацкером родился?

Skipp 25.10.2012 14:37

project1,
Нет, подумай над логикой, помучившись вскоре поймёшь. Ты просто к решению задачи подходишь не с той стороны.

project1 25.10.2012 14:42

Skipp,
Просто я не до конца знаю всех особенностей javascript'a. Может попытаться сделать запрос синхронным? Тогда пока ответ не придёт, дальше ничего не выполнится. Но это тоже неверно как-то...
Можешь хотябы намекнуть на правильный подход? :)

BallsShaped 25.10.2012 14:43

Цитата:

Сообщение от Skipp
Я смотрю ты сразу кулхацкером родился?

Нет, я начала прочитал fuckin manual, а потом, когда возникали вопросы, пользовался поиском. И, о чудо!, не е**л мозги людям на форуме, задавая в тысячный раз одни и те же вопросы.

BallsShaped 25.10.2012 14:46

Цитата:

Сообщение от project1
Может попытаться сделать запрос синхронным?

Страница зависнет, пока не придет ответ. Так делать нельзя.
Цитата:

Сообщение от project1
Можешь хотябы намекнуть на правильный подход?

Просто прочитай про ajax, и вопросы отпадут сами собой.

Skipp 25.10.2012 14:54

BallsShaped,
Ну не все такие как ты, да и тысячу раз одни и те же вопросы не один и тот же пользователь задаёт, так что критика неуместна. Да и думаю, если бы ты мог, то задавал бы вопросы, когда сам изучал основы, вряд ли ты этого не делал потому, что думал примерно такое: "Не буду задавать нубские вопросы, а то разозлю всех своим не знанием... Там наверное таких полно как я, поищу ответ в гугле, а если не найду то пойду убьюсь головой об manual".

project1,
Делайте все действия в самой callback функции и проблема исчезнет

project1 25.10.2012 15:09

Цитата:

Сообщение от project1
Делайте все действия в самой callback функции и проблема исчезнет

$.get('/cp/ajax/alias_exists.php',
		{'alias': alias, 'args': args},
		function(data, textStatus) {
			return data;
		}
	);

Так не получается. Тут я подозреваю замешаны замыкания, но я в этой теме не шарю :(

Skipp 25.10.2012 15:16

project1,
нет тут замыканий,

$.get('/cp/ajax/alias_exists.php',
		{'alias': alias, 'args': args},
		function(data, textStatus) {
 
                        //Вот что ты с ответом собрался делать? Сделай тут или же вызови другую функцию.
		}
	);

project1 25.10.2012 15:18

Цитата:

Сообщение от Skipp
//Вот что ты с ответом собрался делать? Сделай тут или же. вызови другую функцию.

Хочу чтоб основная функция aliasExists возвратила этот самый ответ...

BallsShaped 25.10.2012 15:36

Цитата:

Сообщение от project1
Хочу чтоб основная функция aliasExists возвратила этот самый ответ...

Ты хочешь не возможного, потому что не понимаешь основ того, как это работает. При этом ты и не хочешь понимать основ. Вывод печален.

BallsShaped 25.10.2012 15:43

Цитата:

Сообщение от Skipp
Да и думаю, если бы ты мог, то задавал бы вопросы, когда сам изучал основы

Я мог задавать вопросы. Но у меня никогда не возникало такого желания. Потому что я сначала изучил язык и принципы его работы (окончательно расставили все точки вот эти статьи), прочитал все статьи на этом сайте.

Я считаю, что задать тупые вопросы по основам на javascript.ru - это в первую очередь проявление неуважения к создателю этого ресурса, который потратил много времени на создание структурированного и понятного изложения полезного материала. За что Илье огромное спасибо! Такие дела...

nerv_ 25.10.2012 15:53

Цитата:

Сообщение от BallsShaped
Я считаю, что задать тупые вопросы по основам на javascript.ru - это в первую очередь проявление неуважения к создателю этого ресурса

не согласен

project1 25.10.2012 16:24

Цитата:

Сообщение от BallsShaped
Ты хочешь не возможного, потому что не понимаешь основ того, как это работает. При этом ты и не хочешь понимать основ. Вывод печален.

Раз уж такой знающий, написал бы в парочке предложений суть. Думаю для эксперта по основам как ты это не составит труда.

Skipp 25.10.2012 16:25

BallsShaped,
Не путай теорию с практикой.
И я пожалуй тоже не согласен. Зачем по твоему тогда этот форум?

project1 25.10.2012 16:38

Решил проблему заданием синхронного запроса. Всё равно нельзя будет добавить страницу если alias существует, поэтому временное подвисание на пару секунд не играет никакого значения, иначе для чего вообще существует синхронный запрос?
function aliasExists(alias, args) {
	var ret;
	$.ajax({
		url: '/cp/ajax/alias_exists.php',
		data: {'alias': alias, 'args': args},
		async: false,
		dataType: 'json',
		type: 'GET',
		success: function(data, textStatus) {
			ret = data;
		}
	});
	return ret;
}

Skipp 25.10.2012 16:51

Цитата:

Сообщение от project1
иначе для чего вообще существует синхронный запрос?

Уж не для такого, поверь.
Через время поймёшь через какую ты задницу всё это делаешь, не в обиду, сам когда-то таким был, да и до сих пор остаюсь, в некоторых областях.

project1 25.10.2012 16:57

Skipp,
Понимаю :) Просто пока я не вижу других путей, чтобы запретить дальшейшее выполнение кода, пока я не получу нужный мне ответ. Так как результат этого выполнения зависит от AJAX ответа...

Skipp 26.10.2012 09:28

Так callback функция как раз для этого нужна, она сделает всё что нужно именно после того как придёт ответ.

project1 26.10.2012 10:15

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

Skipp 26.10.2012 10:23

Так зачем тогда return?
function(){
    //Проверка формы, если всё верно отправляем запрос
    $.ajax(.....,function(data){
        //Все действия которые необходимо делать после получения ответа.
    })
}

project1 26.10.2012 11:08

Просто я люблю распределять всё по функциям и не городить всё в одном месте. Поэтому проверку ссылки я вынес в отдельную функцию.
Придётся привести весь код:
//запускаю проверку по нажатии на ссылку
var form = $('form:first');
$('a[href*="/insert/"]').click(function(){
	var href = $(this).attr('href');
	if (checkForm(href)) {
		form.attr('action', href);
		form.submit();
	}
	return false;
});

function checkForm(href) {
	var ret = true, alias;
	$('input.must,textarea.must,select.must').each(function(){
		$(this).removeClass('input-error');
		if ($(this).attr('name') == 'alias') {
			alias = $(this).attr('value', this.value.replace(/\s|_/g, '-').replace(/-{2,}/g, '-').replace(/[^a-z-\dа-я]/gi, '').toLowerCase());
			if (href) {
				if (alias[0].value) {
					if (aliasExists(alias[0].value, getAssocArray(href))) {
						ret = false;
						$(this).addClass('input-error');
					}
				}
			}
		}
		if ($.trim(this.value) == '') {
			ret = false;
			$(this).addClass('input-error');
			$('#tabs').tabs({ selected: 0 });
		}
	});
	return ret;
}

function aliasExists(alias, args) {
	var ret;
	$.ajax({
		url: '/cp/ajax/alias_exists.php',
		data: {'alias': alias, 'args': args},
		async: false,
		success: function(data, textStatus) {
			ret = data;
		}
	});
	return ret;
}

Может это как-нибудь прояснит ситуацию...

Skipp 26.10.2012 11:15

...
aliasExists(alias[0].value, getAssocArray(href), this)
...						

function aliasExists(alias, args, obj) {
	$.ajax({
		url: '/cp/ajax/alias_exists.php',
		data: {'alias': alias, 'args': args},
		success: function(data, textStatus) {
			if(!Boolean(data))
				$(obj).addClass('input-error');
		}
	});

}

project1 26.10.2012 11:25

Это понятно...
Как я писал выше, пока запрос выполняется, остальной код ява скрипта пробежит до конца и форма запостится, так и не дождавшись ответа от сервера и вызова callback функции :)

Skipp 26.10.2012 11:39

В общем, потом разберёшься.


Часовой пояс GMT +3, время: 10:04.