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);
}
})
}