Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Установить переменную (не могу справиться с параллельностью) (https://javascript.ru/forum/misc/24018-ustanovit-peremennuyu-ne-mogu-spravitsya-s-parallelnostyu.html)

Sufir 15.12.2011 15:03

Установить переменную (не могу справиться с параллельностью)
 
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?

Gvozd 15.12.2011 15:38

Цитата:

Сообщение от Sufir
не могу справиться с параллельностью

во-первых, это не паралельность, а ассинхронность - в JS нету параллельности.
ассинхронность - это когда ты можешь вызвать функцию, но ее результат будет доступен не сразу, а через время
При этом в каждый момент времени выполняется только один участок кода, а не несколько паралельно.
в твоем примере, ты вызываешь $.getJSON, но ее результат будет доступен только когда с сервера придет ответ, и будет он доступен в функции-колбеке(где ты его и принимаешь в своем коде)
При этом, return auth; вызывается сразу же, после того как была выполнена функция $.getJSON, но до того как пришел результат(и возможно даже до того, как был послан запрос)
Цитата:

Сообщение от Sufir
Или, может быть я совсем не правильно делаю и мыслю из-за того, что привык php?

Именно так.
Твою поблему можно разрулить дввумя способами:
1)нежелательный
указать $.getJSON, чтобы он выполнялся синхронно(в дкоументации JQUery описано как сделать)
При этом, пока с сервера не придет ответ, код дальше не будет выполнятся. А когда придет, то выполнится return auth;, и ты получишь нужный тебе результат.
НО!
При этом не будет выполнятся совсем никакой код. Браузер тупо "зависнет", не позволяя пользователю кликнуть что-либо, либо как-то взаимодействовать со страницей.
Даже зависание на полсекунды будет неприятно, что уж говорить, если запрос будет выполнятся несколько секунд.
Поэтому так никто не делает.
2) привыкать к новой парадигме - асинхронности.
Те действия, которые ты хочешь произвести с данными, прищедшими с сервера - ты должен делать в том колбеке, где они доступны.
Где у тебя написано auth = true; , вот там и вызывай alert, и что еще тебе нужно

Sufir 15.12.2011 17:19

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


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