Axios обещают не вернуться вовремя - PullRequest
0 голосов
/ 23 мая 2019

JSON.stringify (security_check ()), выполняет функцию с axios.post, и она должна возвращать объект, который я могу использовать в качестве return () для security_check (). У меня проблема в том, что когда я вызываю security_check (), я не могу заставить функцию ждать завершения axios и использовать ответ axios в качестве ответа моей функции

Я попытался вернуться (axios), но axios возвращается после завершения seucritycheck.

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 голосов
/ 24 мая 2019

Проблема в том, что вы не await на security_check.security_check и securitycheck возвращают обещание, а не результат.

При использовании функций 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()")
})
...