Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Ajax函数返回未定义?_Javascript_Jquery_Asynchronous - Fatal编程技术网

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
。当您的代码在一个地方等待结果时就足够了,而该地方就是您使用
等待登录(…)
的那一行。