Javascript Ajax函数返回未定义?
我有一段代码返回登录时的Javascript Ajax函数返回未定义?,javascript,jquery,asynchronous,Javascript,Jquery,Asynchronous,我有一段代码返回登录时的access\u token 异步函数登录(用户名、密码){ wait.ajax({ url:“/api/login”, 类型:“POST”, 数据:`{“用户名”:“${username}”,“密码”:“${password}”}`, 数据类型:“文本”, 成功:异步函数(响应){ var a=await JSON.parse(响应) console.log(a.token.access\u令牌) 返回a.token.access\u令牌 }, 错误:函数(响应){ 返
access\u token
异步函数登录(用户名、密码){
wait.ajax({
url:“/api/login”,
类型:“POST”,
数据:`{“用户名”:“${username}”,“密码”:“${password}”}`,
数据类型:“文本”,
成功:异步函数(响应){
var a=await JSON.parse(响应)
console.log(a.token.access\u令牌)
返回a.token.access\u令牌
},
错误:函数(响应){
返回“false”
}
})
}
它又回来了
eyjhbgcoijiuzi1niisinr5cci6ikpxvcj9.eyjhdxrob3jpemvkijp0cnvllcjlehaioje2mtgzodiznzusinvzzxjuyy1lijoic2sxmtiyin0.e16nHpJUsNmMSAcPgaHkmJgwrnBkp4jB7KHe_ylAvKc//login()中的console.log()
另一个函数中未定义//console.log()
console.log(等待登录(问题[0]。值,问题[2]。值))
我使用Async/Await是错误的吗?还是其他原因?- 您需要使用
的承诺语义,$.ajax()
回调对返回值不起作用success
- 您需要
从
调用中返回承诺$.ajax()
- 您的
函数中绝对不需要login()
或async
wait
function login(username, password) {
return $.ajax({
url: "/api/login",
type: "POST",
data: {
username: username,
password: password
},
dataType: "text"
}).then(function (response) {
var data = JSON.parse(response);
return data.token.access_token;
}).fail(function (jqXhr, status, error) {
return false;
});
}
及
当您希望从服务器获得JSON时,设置
数据类型:“text”
是没有意义的。在服务器响应中设置Content-Type:application/json
头,删除dataType
参数,jQuery甚至会自动为您解析json
function login(username, password) {
return $.post("/api/login", {username: username, password: password})
.then((data) => data.token.access_token)
.fail((jqXhr, status, error) => false);
}
如果需要,可以将其转换为基于异步
/等待
的函数:
function login(username, password) {
try {
const data = await $.post("/api/login", {username: username, password: password});
return data.token.access_token;
} catch (err) {
return false;
}
}
- 您需要使用
的承诺语义,$.ajax()
回调对返回值不起作用success
- 您需要
从
调用中返回承诺$.ajax()
- 您的
函数中绝对不需要login()
或async
wait
function login(username, password) {
return $.ajax({
url: "/api/login",
type: "POST",
data: {
username: username,
password: password
},
dataType: "text"
}).then(function (response) {
var data = JSON.parse(response);
return data.token.access_token;
}).fail(function (jqXhr, status, error) {
return false;
});
}
及
当您希望从服务器获得JSON时,设置
数据类型:“text”
是没有意义的。在服务器响应中设置Content-Type:application/json
头,删除dataType
参数,jQuery甚至会自动为您解析json
function login(username, password) {
return $.post("/api/login", {username: username, password: password})
.then((data) => data.token.access_token)
.fail((jqXhr, status, error) => false);
}
如果需要,可以将其转换为基于异步
/等待
的函数:
function login(username, password) {
try {
const data = await $.post("/api/login", {username: username, password: password});
return data.token.access_token;
} catch (err) {
return false;
}
}
为什么在
JSON.parse
上使用await
?它是同步的function@TrevorKropp还有登录函数中的等待。@TrevorKropp我尝试了不同的事情,顺便说一句,我对JS世界是新手。所以我不知道,但是谢谢你告诉我,这能回答你的问题吗?是的,谢谢@freedomn mWhy你在JSON.parse上使用wait
?它是同步的function@TrevorKropp还有登录函数中的等待。@TrevorKropp我尝试了不同的事情,顺便说一句,我对JS世界是新手。所以我不知道,但是谢谢你告诉我,这能回答你的问题吗?是的,谢谢@freedomn mThanks它成功了。我想这是因为我们也在返回ajax调用,所以它会等待吗?它正确吗?@SatyamKulkarni原则上是的-任何本应与wait
一起工作的函数调用都需要返回一个承诺。因此,如果你想让你的login()
函数wait
成为可能,它需要返回一个承诺$.ajax()
产生一个承诺,所以返回它。但是如果您要返回一个承诺,则不再需要在login()
函数中使用wait
。当你的代码在一个地方等待结果时,这就足够了,而这个地方就是你使用等待登录(…)
的那一行。谢谢你的工作。我想这是因为我们也在返回ajax调用,所以它会等待吗?它正确吗?@SatyamKulkarni原则上是的-任何本应与wait
一起工作的函数调用都需要返回一个承诺。因此,如果你想让你的login()
函数wait
成为可能,它需要返回一个承诺$.ajax()
产生一个承诺,所以返回它。但是如果您要返回一个承诺,则不再需要在login()
函数中使用wait
。当您的代码在一个地方等待结果时就足够了,而该地方就是您使用等待登录(…)
的那一行。