Установить переменную (не могу справиться с параллельностью)
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? |
Цитата:
ассинхронность - это когда ты можешь вызвать функцию, но ее результат будет доступен не сразу, а через время При этом в каждый момент времени выполняется только один участок кода, а не несколько паралельно. в твоем примере, ты вызываешь $.getJSON, но ее результат будет доступен только когда с сервера придет ответ, и будет он доступен в функции-колбеке(где ты его и принимаешь в своем коде) При этом, return auth; вызывается сразу же, после того как была выполнена функция $.getJSON, но до того как пришел результат(и возможно даже до того, как был послан запрос) Цитата:
Твою поблему можно разрулить дввумя способами: 1)нежелательный указать $.getJSON, чтобы он выполнялся синхронно(в дкоументации JQUery описано как сделать) При этом, пока с сервера не придет ответ, код дальше не будет выполнятся. А когда придет, то выполнится return auth;, и ты получишь нужный тебе результат. НО! При этом не будет выполнятся совсем никакой код. Браузер тупо "зависнет", не позволяя пользователю кликнуть что-либо, либо как-то взаимодействовать со страницей. Даже зависание на полсекунды будет неприятно, что уж говорить, если запрос будет выполнятся несколько секунд. Поэтому так никто не делает. 2) привыкать к новой парадигме - асинхронности. Те действия, которые ты хочешь произвести с данными, прищедшими с сервера - ты должен делать в том колбеке, где они доступны. Где у тебя написано auth = true; , вот там и вызывай alert, и что еще тебе нужно |
Большое спасибо, собственно это и предполагал. Будем разбираться и привыкать...
|
Часовой пояс GMT +3, время: 17:19. |