jQuery链ajax调用

jQuery链ajax调用,jquery,promise,Jquery,Promise,我一辈子都不明白为什么这不起作用 function Register(email, password) { var data = { Email: email, Password: password, ConfirmPassword: password }; return $.ajax({ type: 'POST', url: baseUrl + 'api/Account/Register', contentType: 'application

我一辈子都不明白为什么这不起作用

function Register(email, password) {

var data = {
    Email: email,
    Password: password,
    ConfirmPassword: password
};

return $.ajax({
    type: 'POST',
    url: baseUrl + 'api/Account/Register',
    contentType: 'application/json; charset=utf-8',
    data: JSON.stringify(data)
})

}

function Login(email, password) {

var data = {
    grant_type: 'password',
    username: email,
    password: password
};

return $.ajax({
    type: 'POST',
    url: baseUrl + 'Token',
    data: data
}).done(function (data) {
    sessionStorage.setItem(tokenKey, data.access_token);
});

}
现在。。。我想注册,然后登录一个按钮点击

var email = $('input[name="email"]').val();
var password = $('input[name="password"]').val();

Register(email, password).then(Login(email, password))
但是,该代码并没有按顺序调用它们。它通常先登录


我也尝试过done()和when(),但我真的不明白两者的区别,我希望能得到一些帮助。。。哭喊

我认为问题在于它正在立即评估
登录(电子邮件、密码)

尝试:
注册(电子邮件,密码)。然后(函数(){Login(电子邮件,密码);})

我认为您需要在ajax调用中添加async:false。但我不会这样做。它将推迟到ajax运行完毕。我会把登录名放在ajax调用的成功函数中。谢谢,这很有效。。。我讨厌javascript。。。关于为什么需要额外的包装函数有什么见解吗?按照您调用它的方式,它将首先调用
Register
,然后调用
Login
,因为它将
Login
函数返回的值传递给
。然后()。通过添加包装器,
Login
函数在
Register
返回的延迟问题得到解决之前不会执行。@hatcyl-Javascript在这方面与大多数语言没有什么不同。如果您将
Login(xxx)
作为参数传递给函数或方法,我所知道的所有语言都会立即调用它。这不仅仅是一个Javascript的东西。传递函数引用(以便以后调用)与现在调用函数并传递其返回结果是不同的语法。您所做的只是一个常见的编程错误,而不是Javascript独有的东西。@jfriend00-是的,您是对的,不一定是Javascript的东西,我只是不习惯这种模式。说实话,任何新的模式都需要习惯。谢谢,尽管这会奏效,但当你需要将许多函数链接在一起时,它会很快变得难看,有时是有条件的。我试着用“承诺”的方式。。。但我是个大傻瓜。
function Register(email, password) {

    var data = {
        Email: email,
        Password: password,
        ConfirmPassword: password
    };

    return $.ajax({
        type: 'POST',
        url: baseUrl + 'api/Account/Register',
        contentType: 'application/json; charset=utf-8',
        data: JSON.stringify(data),
        success: function(msg) {
            Login(email, password);
        }
    })

}