Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.12.2011, 15:03
Аватар для Sufir
Аспирант
Отправить личное сообщение для Sufir Посмотреть профиль Найти все сообщения от Sufir
 
Регистрация: 15.06.2008
Сообщений: 47

Установить переменную (не могу справиться с параллельностью)
var token = null;
               
function auth( mail, pass ){

    var request = {
                    t:    token,
                    c:    "auth",
                    a:    "index",
                    mail: mail,
                    pass: pass,
                  };
    
    var auth = false;

    // вопользуемся jQuery
    $.getJSON( '/', request, function(data) {

        console.log( request );
        console.log( data );
        
        token = data.token;

        if ( data.result !== undefined ){

            if ( data.result === true ){

                alert( 'Logged in' );
                auth = true;
                
            }

        }

    })
    .complete( function() { auth = true; } );
    
    return auth;

}

alert( auth( "my@mailru", "pass123" ) );


В результате наблюдаю: false, Loged in А хотелось бы: Loged in, true не могу справиться с параллельностью...

Собственно как заставить функцию возвращать результат (true/false)? Или, может быть я совсем не правильно делаю и мыслю из-за того, что привык php?
Ответить с цитированием
  #2 (permalink)  
Старый 15.12.2011, 15:38
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от Sufir
не могу справиться с параллельностью
во-первых, это не паралельность, а ассинхронность - в JS нету параллельности.
ассинхронность - это когда ты можешь вызвать функцию, но ее результат будет доступен не сразу, а через время
При этом в каждый момент времени выполняется только один участок кода, а не несколько паралельно.
в твоем примере, ты вызываешь $.getJSON, но ее результат будет доступен только когда с сервера придет ответ, и будет он доступен в функции-колбеке(где ты его и принимаешь в своем коде)
При этом, return auth; вызывается сразу же, после того как была выполнена функция $.getJSON, но до того как пришел результат(и возможно даже до того, как был послан запрос)
Сообщение от Sufir
Или, может быть я совсем не правильно делаю и мыслю из-за того, что привык php?
Именно так.
Твою поблему можно разрулить дввумя способами:
1)нежелательный
указать $.getJSON, чтобы он выполнялся синхронно(в дкоументации JQUery описано как сделать)
При этом, пока с сервера не придет ответ, код дальше не будет выполнятся. А когда придет, то выполнится return auth;, и ты получишь нужный тебе результат.
НО!
При этом не будет выполнятся совсем никакой код. Браузер тупо "зависнет", не позволяя пользователю кликнуть что-либо, либо как-то взаимодействовать со страницей.
Даже зависание на полсекунды будет неприятно, что уж говорить, если запрос будет выполнятся несколько секунд.
Поэтому так никто не делает.
2) привыкать к новой парадигме - асинхронности.
Те действия, которые ты хочешь произвести с данными, прищедшими с сервера - ты должен делать в том колбеке, где они доступны.
Где у тебя написано auth = true; , вот там и вызывай alert, и что еще тебе нужно
Ответить с цитированием
  #3 (permalink)  
Старый 15.12.2011, 17:19
Аватар для Sufir
Аспирант
Отправить личное сообщение для Sufir Посмотреть профиль Найти все сообщения от Sufir
 
Регистрация: 15.06.2008
Сообщений: 47

Большое спасибо, собственно это и предполагал. Будем разбираться и привыкать...

Последний раз редактировалось Sufir, 16.12.2011 в 14:56.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не могу установить background-position в ie7-8 lowercase jQuery 11 27.08.2011 22:12
установить переменную сессии через ajax при загрузке страницы optik77 AJAX и COMET 3 02.06.2011 17:36
Регулярка (не могу никак с ней справиться) igsavenko Общие вопросы Javascript 6 26.04.2011 18:53
Не могу записать значение в переменную!!! di@mond Элементы интерфейса 3 30.06.2009 23:05
Никак не могу справиться с jQuery.each() khusamov jQuery 4 25.06.2009 20:00