I got a little problem here guys. I'm trying to implement the following scenario:
Sounds simple? Here's what I've done: I created a function isLoggedIn
that will issue the first request to the server in order to determine if the user is logged in. I issue this request using jQuery.ajax
method. Here's my function looks like:
function isLoggedIn() { $.ajax({ async: "false", type: "GET", contentType: "application/json; charset=utf-8", dataType: "json", url: "/isloggedin", success: function(jsonData) { alert("jsonData =" + jsonData.LoggedIn); return jsonData.LoggedIn; } }); }
The returned JSON is very simple, it looks like the following:
{ LoggedIn: true } or { LoggedIn : false }
Now this method, actually works and displays the alert correctly: JsonData = true
if logged in, and JsonData = false
if not logged in. Up to this point there's no problem, the problem occurs when I try to call this method: I call it like so:
$(".friend_set .img").click(function() { debugger; if (isLoggedIn()) { alert("alredy logged in"); trackAsync(); popupNum = 6; } else { alert("not logged in"); //always displays this message. popupNum = 1; } //centering with css centerPopup(popupNum); //load popup loadPopup(popupNum); return false; });
Calling isLoggedIn
always returns false
, and it returns false before the ajax request finishes (because the message
jsonData = trueis displayed after the message "not logged in". I made sure that the request is **NOT** Asynchronous by stating
async: false`!
Apparently it's still working asynchronously, though. What am I missing here guys?
Don't just use callback functions as you might read on the web or in other answers. Learn about Deferred and Promise objects, and instead of returning the data, return a promise that you can use to attach behavior to when that promise is 'resolved'.
As of jQuery 1.8, the use of async:false in jQuery. ajax() is deprecated.
jQuery Ajax Async False is a function of jQuery in which if we set async as false that means the first statement has to be complete before calling the next statement. If we set the async request as true, then the next statement will begin its execution whether the previous statement is completed or not.
Synchronous XMLHttpRequest (async = false) is not recommended because the JavaScript will stop executing until the server response is ready. If the server is busy or slow, the application will hang or stop.
You need async:false
, not async:"false"
. (i.e. pass boolean false
, not string "false"
).
Edit: also with async requests you need to return a value after the call to ajax
, not inside your success handler:
function isLoggedIn() { var isLoggedIn; $.ajax({ async: false, // ... success: function(jsonData) { isLoggedIn = jsonData.LoggedIn } }); return isLoggedIn }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With