jQuery没有指定异步调用evel async:false

时间:2012-08-21 08:40:40

标签: javascript jquery

这是我的代码

var jsonpath;

function loginFromDef() {

    var a = grantAccess($('#login :input').serialize());
    if (a.Msg) {
        $('#msg').html(a.Msg).attr('class', 'error');
    }
    else if (a.done) {
        var returnUrl = getQueryString('ReturnURL');
        if (returnUrl)
            window.location = returnUrl;
        else
            window.location = 'Home.aspx';
    }


    return false;
}

function grantAccess(dataToPost) {

    $.ajax({
        type: "POST",
        url: jsonpath + 'Json.ashx?method=GrantAccess',
        async: false,
        data: dataToPost,
        success: function (data) {
            return data;
        }
    });
}

function getQueryString(name) {
    var match = RegExp('[?&]' + name + '=([^&]*)').exec(window.location.search);
    return match && decodeURIComponent(match[1].replace(/\+/g, ' '));
}
我在Default.aspx页面中定义了

var jsonPath,我在loginFromDef()提交按钮事件上调用了函数onclick

我收到错误 TypeError: a is undefined 不要担心我的.ashx处理程序。它工作正常。我试试了。

我认为函数var a中的loginFromDef未初始化。因为选项中的 may be jQuery is making asynchronous call. Even I have set async:false

我错了.. ??请提出解决方案。

3 个答案:

答案 0 :(得分:6)

grantAccess中没有任何退货声明。回调中的return语句没有任何影响(因为它在内部由$.ajax调用)。

Ajax调用同步,但您没有从grantAccess返回任何数据。

你可以这样做:

return $.ajax({
    type: "POST",
    url: jsonpath + 'Json.ashx?method=GrantAccess',
    async: false,
    data: dataToPost,
}).responseText;

也许您必须在返回该值之前使用$.parseJSON

$.ajax会返回jqXHR个对象,您可以在documentation找到更多相关信息。

但是,我强烈建议不要使用同步Ajax调用,我没有看到任何理由让你在这里需要一个。同步请求可能会阻止浏览器(包括其UI),直到收到响应,使浏览器无响应,从而导致糟糕的使用体验。

更改您的代码,以便您可以使用回调来处理响应。例如:

function loginFromDef() {

    grantAccess($('#login :input').serialize()).done(function(a) {
        if (a.Msg) {
            $('#msg').html(a.Msg).attr('class', 'error');
        }
        else if (a.done) {
            var returnUrl = getQueryString('ReturnURL');
            if (returnUrl)
                window.location = returnUrl;
            else
                window.location = 'Home.aspx';
        }
    });

    return false;
}

其中grantAccess只返回jqXHR返回的$.ajax对象:

function grantAccess(dataToPost) {
    return $.ajax({
        type: "POST",
        url: jsonpath + 'Json.ashx?method=GrantAccess',
        data: dataToPost
    });
}

答案 1 :(得分:2)

在进行AJAX调用之后,您的grantAccess函数正在返回。由于您没有为grantAccess函数指定退货,因此它会隐式返回undefined

您的success函数正在将data变量返回给它的调用者,这是jQuery代码中的某个地方。

答案 2 :(得分:1)

问题出在Ajax调用的success函数中。

function grantAccess(dataToPost) {
    $.ajax({
        type: "POST",
        url: jsonpath + 'Json.ashx?method=GrantAccess',
        async: false,
        data: dataToPost,
        success: function (data) {
            return data;
        }
    });
}

成功功能与GrantAccess功能不同。 GrantAccess不返回值,因此以下行:

var a = grantAccess($('#login :input').serialize());

始终会导致a成为null

您应该做的是以下内容:

function loginFromDef() {

    grantAccess($('#login :input').serialize());
}

function grantAccess(dataToPost) {

    $.ajax({
        type: "POST",
        url: jsonpath + 'Json.ashx?method=GrantAccess',
        async: false,
        data: dataToPost,
        success: TheFollowUpFunction(data)
    });
}

    //NEWLY ADDED:

    function TheFollowUpFunction(a) {

        if (a.Msg) {
            $('#msg').html(a.Msg).attr('class', 'error');
     }
    else if (a.done) {
         var returnUrl = getQueryString('ReturnURL');
          if (returnUrl)
            window.location = returnUrl;
          else
            window.location = 'Home.aspx';
    }

    }