Данные ответа Axios не определены, пока запрос выполнен успешно

#javascript #reactjs #axios

Вопрос:

     function confirmPassword() {
    let password = document.getElementById("password").value
    let email = document.getElementById("email").value

    Service.confirmPassword(email, password).then(response => {
        res = response.data
        setTwoFactorStep(1)
    }).catch(err => {
        alert(err.data.message)
    })
    alert(res)
}  
 

После того, как запрос выполнен, response.data не определен, в то время как я могу проверить свой браузер, он прошел успешно, и тело присутствует. Если я предупрежу response.data внутри .then , я получу Object object

OBS: var res объявлен ранее, и метод Service.confirmPassword является axios.post.

Комментарии:

1. какой тип данных вы ожидаете от api

2. Я ожидаю, что в теле появится JSON.

3. затем проанализируйте его ..

Ответ №1:

Код, который вы опубликовали, не синхронен, предупреждение сработает до того, как ваш http-запрос получит возможность разрешить, и, вероятно, поэтому вы получите неопределенное. если вы хотите что-то сделать с телом ответа, вам, вероятно, следует сделать это в обратном вызове «тогда».

 function confirmPassword() {
    let password = document.getElementById("password").value
    let email = document.getElementById("email").value

// 1.your service call through axios gets triggered
    Service.confirmPassword(email, password).then(response => {
      // 3.this gets execute after the alert below once the http request has been resolved
        res = response.data 
        setTwoFactorStep(1);
    // invoke your handler here...
    }).catch(err => {
        alert(err.data.message)
    })
    alert(res) // 2.this gets executed next
}  
 

если вы хотите записать это синхронным способом, рассмотрите возможность использования async/await

  async function confirmPassword() {
    let password = document.getElementById("password").value
    let email = document.getElementById("email").value

    const response = await Service.confirmPassword(email, password).catch(err => alert(err.data.message));
    res = response.data;
    setTwoFactorStep(1);
    alert(res)