javascript - AJAX "success"在返回响应之前执行

标签 javascript jquery asp.net ajax

我希望这只是一个简单的修复,因为我在某个地方有点愚蠢。我正在使用 AJAX 执行 ASP.NET MVC 登录。有一个“成功”处理程序,它向调用函数返回“true”值,而调用函数又加载主页。

问题是“成功”处理程序在返回任何值之前执行 - 这意味着什么也没有发生,因为该值不是“SUCCESS”。我可以通过查看 Firebug 中的请求来确认这一点,返回的值是 SUCCESS 但没有任何反应。如果我在函数末尾应用断点,然后继续执行,它就可以正常工作。

我不知道问题是什么,我将非常感谢您的帮助或对我做错了什么的解释。

谢谢!

我的 JS 函数:

function LogIn(UserName, Password) {
var Cont = true;
var ErrorString = "";
if (UserName == null || UserName == "") {
    Cont = false;
    ErrorString += "Username is Required.";
}
if (Password == null || Password == "") {
    Cont = false;
    ErrorString += "Password is Required.";
}

var result = false;

if (Cont) {
    var LogInUrl = "/AJAX/LogIn?UserName=" + UserName + "&Password=" + Password;
    $.ajax({
        url: LogInUrl,
        type:"GET",
        success: function( data ){
            if (data == "SUCCESS") {
                result = true;
            }
        }
    })
}

return result;

}

更新:调用LogIn函数的函数:

$('#FormLogin').submit(function (e) {
    e.preventDefault();
    var UserName = $("#TxtLoginUsername").val();
    var Password = $("#TxtLoginPassword").val();
    var IsLoggedIn = LogIn(UserName, Password);
    if (IsLoggedIn) {
        window.location.assign("/");
    } else {
        $('#LoginErrorContainer').show();
        $('#LoginErrorContainer .error-text').html("There was a problem logging you in. Please try again.");
    }
})

正如我所说,该函数完成了它的工作并让我登录,但“成功”处理程序似乎在返回值之前执行。

最佳答案

将您的 ajax 调用更改为如下所示:

$.ajax({
    url: LogInUrl,
    type:"GET",
    success: function( data ){
        if (data == "SUCCESS") {
            window.location.assign("/");
        } else {
            $('#LoginErrorContainer').show();
            $('#LoginErrorContainer .error-text').html("There was a problem logging you in. Please try again.");
        }
    }
});

LogIn 返回 result 是没有意义的,它总是错误的。您需要将处理返回值的代码放在回调中

如果您不喜欢 LogIn 函数与 DOM 操作如此紧密地结合在一起,另一种选择是从 ajax 调用中返回 Promise。因此,在 LogIn 结束时,您需要执行以下操作:

return $.ajax({
    url: LogInUrl,
    type:"GET"
    }
});

然后当你调用它时,你会做这样的事情:

LogIn(UserName, Password).then(function(data) {
    if (data == "SUCCESS") {
        window.location.assign("/");
    } else {
        $('#LoginErrorContainer').show();
        $('#LoginErrorContainer .error-text').html("There was a problem logging you in. Please try again.");
    }
});

关于javascript - AJAX "success"在返回响应之前执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25315356/

相关文章:

asp.net - ASP.NET 网站项目在编译时是否天生就很慢,或者我可能有更深层次的问题?

javascript - 在 JavaScript/Typescript 中将字符串数组转换为对象,最里面的子元素为空数组

javascript - 如何使用 Angular2 和 TypeScript 使选定的下拉值在更改时显示在标题上

javascript - 选中 jQuery DataTable 所有页面的所有复选框(服务器端处理)

javascript - 如何使用 jQuery(或 Javascript)获取可见文本?

javascript - 在 Bootstrap 中折叠标签

asp.net - Facebook 标签身份验证

c# - 仅使用日期时间格式比较日期和显示时间

javascript - 如何使用@requestMapping从JS访问https协议(protocol)到spring boot?

javascript - 如何在 Node.js 中追加到新行