我在这里有一个小问题。我试图实现以下场景:
>用户打开主页并看到其他用户和点击的列表
添加一个到他的朋友列表。
>我向服务器资源发出Ajax请求以验证用户
登录,如果是,我向另一个服务器发出另一个ajax请求
资源实际添加到用户的朋友列表。
听起来很简单?这是我做的:我创建了一个函数isLoggedIn将发出第一个请求到服务器,以确定用户是否登录。我使用jQuery.ajax方法发出此请求。这里的我的功能看起来像:
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; } }); }
返回的JSON非常简单,看起来像下面这样:
{ LoggedIn: true } or { LoggedIn : false }
现在这个方法实际上工作并正确显示警报:JsonData = true如果登录,并且JsonData = false如果没有登录。
到这一点没有问题,当我尝试调用这个方法时出现问题:我这样调用它:
$(".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; });
调用isLoggedIn总是返回false,并且在ajax请求完成之前返回false(因为messagejsonData = true显示在消息“not logged in”之后)。我确保请求是** NOT ** Asynchronous by statingasync:false`!
显然,它仍然是异步工作,虽然。我在这里缺少什么家伙?
解决方法
你需要async:false,而不是async:“false”。 (即传递布尔值false,不是字符串“false”)。
编辑:
也有异步请求,你需要在调用ajax后返回一个值,而不是在你的成功处理程序内部:
function isLoggedIn() { var isLoggedIn; $.ajax({ async: false,// ... success: function(jsonData) { isLoggedIn = jsonData.LoggedIn } }); return isLoggedIn }