Области видимости
Здрасти) Функция должна возвращать результат ответа, который содержится в переменной 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; } |
Ну так правильно callback сработает, только тогда, когда сервер ответит, а return функцией будет возвращён сразу.
Поставьте таймер и выведете ret и посмотрите, что он вам покажет. |
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 |
Первый параметр у 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,
Я смотрю ты сразу кулхацкером родился? |
project1,
Нет, подумай над логикой, помучившись вскоре поймёшь. Ты просто к решению задачи подходишь не с той стороны. |
Skipp,
Просто я не до конца знаю всех особенностей javascript'a. Может попытаться сделать запрос синхронным? Тогда пока ответ не придёт, дальше ничего не выполнится. Но это тоже неверно как-то... Можешь хотябы намекнуть на правильный подход? :) |
Цитата:
|
Цитата:
Цитата:
|
BallsShaped,
Ну не все такие как ты, да и тысячу раз одни и те же вопросы не один и тот же пользователь задаёт, так что критика неуместна. Да и думаю, если бы ты мог, то задавал бы вопросы, когда сам изучал основы, вряд ли ты этого не делал потому, что думал примерно такое: "Не буду задавать нубские вопросы, а то разозлю всех своим не знанием... Там наверное таких полно как я, поищу ответ в гугле, а если не найду то пойду убьюсь головой об manual". project1, Делайте все действия в самой callback функции и проблема исчезнет |
Цитата:
$.get('/cp/ajax/alias_exists.php', {'alias': alias, 'args': args}, function(data, textStatus) { return data; } ); Так не получается. Тут я подозреваю замешаны замыкания, но я в этой теме не шарю :( |
project1,
нет тут замыканий, $.get('/cp/ajax/alias_exists.php', {'alias': alias, 'args': args}, function(data, textStatus) { //Вот что ты с ответом собрался делать? Сделай тут или же вызови другую функцию. } ); |
Цитата:
|
Цитата:
|
Цитата:
Я считаю, что задать тупые вопросы по основам на javascript.ru - это в первую очередь проявление неуважения к создателю этого ресурса, который потратил много времени на создание структурированного и понятного изложения полезного материала. За что Илье огромное спасибо! Такие дела... |
Цитата:
|
Цитата:
|
BallsShaped,
Не путай теорию с практикой. И я пожалуй тоже не согласен. Зачем по твоему тогда этот форум? |
Решил проблему заданием синхронного запроса. Всё равно нельзя будет добавить страницу если 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,
Понимаю :) Просто пока я не вижу других путей, чтобы запретить дальшейшее выполнение кода, пока я не получу нужный мне ответ. Так как результат этого выполнения зависит от AJAX ответа... |
Так callback функция как раз для этого нужна, она сделает всё что нужно именно после того как придёт ответ.
|
У меня идёт проверка формы. И перед тем, как её запостить, обязательно нужно проверить наличие одного поля в базе. Если же я буду делать проверку в callback функции, то, пока выполняется запрос, дальнейший код проверки формы уже завершит действие и, если условия проверки будут удовлетворены (кроме наличия одного поля из базы), форма отправится и только потом сработает callback функция.
|
Так зачем тогда return?
function(){ //Проверка формы, если всё верно отправляем запрос $.ajax(.....,function(data){ //Все действия которые необходимо делать после получения ответа. }) } |
Просто я люблю распределять всё по функциям и не городить всё в одном месте. Поэтому проверку ссылки я вынес в отдельную функцию.
Придётся привести весь код: //запускаю проверку по нажатии на ссылку 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; } Может это как-нибудь прояснит ситуацию... |
... 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'); } }); } |
Это понятно...
Как я писал выше, пока запрос выполняется, остальной код ява скрипта пробежит до конца и форма запостится, так и не дождавшись ответа от сервера и вызова callback функции :) |
В общем, потом разберёшься.
|
Часовой пояс GMT +3, время: 10:04. |