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