$ .ajax({async:false})请求仍然是异步触发?

时间:2009-10-07 13:37:36

标签: asp.net-mvc ajax jquery

我这里有点问题。我正在尝试实施以下方案:

  1. 用户打开主页并查看其他用户和点击的列表 将一个添加到他的朋友列表中。
  2. 我向服务器资源发出Ajax请求以验证用户是否 已登录,如果是,我向另一台服务器发出另一个ajax请求 实际将其添加到用户的朋友列表的资源。
  3. 听起来很简单?这就是我所做的:我创建了一个函数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,并返回false before the ajax request finishes (because the message jsonData = true is displayed after the message "not logged in". I made sure that the request is **NOT** Asynchronous by stating async:false`!

    显然,它仍然是异步工作的。我在这里想念的是什么?

1 个答案:

答案 0 :(得分:62)

您需要async:false,而不是async:"false"。 (即传递布尔false,而不是字符串"false")。

编辑: 对于异步请求,您需要在调用成功处理程序中的ajax而不是之后返回值

function isLoggedIn() {
    var isLoggedIn;
    $.ajax({
        async: false,
        // ...
        success: function(jsonData) {
            isLoggedIn = jsonData.LoggedIn
        }
    });
    return isLoggedIn 
}