Axios承诺不会按时返回

时间:2019-05-23 18:38:35

标签: promise async-await return axios

JSON.stringify(security_check())正在运行一个具有axios.post的函数,它应该返回一个对象,我可以将其用作security_check()的return()。我遇到的问题是,当我调用security_check()时,我无法让函数等待axios完成并将axios响应用作我的函数响应

我尝试过return(axios),但是aucios在安全检查完成后会回来。

class AppLogin extends React.Component{
    console.log("class before calling security_check()")
    sessionStorage.setItem('profile', JSON.stringify(securitycheck()))
    console.log("class after calling securitycheck()")
}


------------
//with return axios

function securitycheck() {

let profile = {}
const s_token = JSON.parse(sessionStorage.getItem('token'))
console.log("inside securitycheck, before axios")
return axios.post("http://localhost:3001/account/", s_token, {
    headers: {
        'Content-Type': 'application/json',
        'Accept' : 'application/json'
    }
})
.then(res => {
profile = res.data
console.log("inside .then")
return profile
}).catch(err => err);
} 
----------
CONSOLE:
class before calling securitycheck()
SecurityCheck.js:7 inside securitycheck
AppLogin.js:45 class after calling securitycheck()
SecurityCheck.js:14 inside async


// with async/await

async function security_check() {

const s_token = JSON.parse(sessionStorage.getItem('token'))
console.log("inside securitycheck")
let res = await axios.post("http://localhost:3001/account/", s_token, {
        headers: {
            'Content-Type': 'application/json',
            'Accept' : 'application/json'
        }
})
console.log("inside async")
return res.data;
}

CONSOLE:
class before calling securitycheck()
SecurityCheck.js:7 inside securitycheck
AppLogin.js:45 class after calling securitycheck()
SecurityCheck.js:14 inside async

没有错误,只是没有正确的答案:)

1 个答案:

答案 0 :(得分:0)

问题是您不是await的security_check用户。 security_checksecuritycheck返回的是承诺而不是结果。

使用async / then函数时,使用return关键字时,结果实际上包装在Promise.resolve中。因此,看起来好像代码正在返回res.data,但实际上是在返回对res.data的承诺

更改

sessionStorage.setItem('profile', JSON.stringify(security_check()))

收件人

sessionStorage.setItem('profile', JSON.stringify(await security_check()))

或者如果您使用then语法

securitycheck().then(val => {
    sessionStorage.setItem('profile', JSON.stringify(val))
    console.log("class after calling securitycheck()")
})