使用Vue.js异步/等待axios调用

GCi*_*ien 8 javascript asynchronous async-await vue.js axios

设置我的一个,我有点麻烦.我的Vue.js应用程序中的值.我相信我要么不正确理解异步axios调用,要么在Vue.js中如何异步工作.

我有以下三种方法:

updateAvailability(availability) {
    if (availability == true) {
        this.showYourDetails();
    } else {
        this.showBookingDetails();
    }
},
checkAvailability: async function(event) {
    event.preventDefault();
    const availability = await this.handleAvailabilityRequest(event);
    this.loading = true;
    console.log(availability); //This evaluates to undefined
    const availabilityUpdate = await this.updateAvailability(availability);
    this.loading = false;
},
handleAvailabilityRequest: async function(event) {
    event.preventDefault();
    let valid = this.validateFieldsForAvailabilityRequest(); //Ignore this for this particular question, assume valid is always true

    if (valid) { // This is true
        let config = {
            headers: {
                "X-CSRFToken": this.csrfToken,
                "Content-Type": 'application/x-www-form-urlencoded',
            }
        }

        let formData = new FormData();
        let reservationTime = this.reservationHourSelected + ':' + this.reservationMinuteSelected;

        formData.set('type', 'availability_request');
        formData.set('session_name', this.sessionName);
        formData.set('reservation_party_size', this.reservationPartySize);
        formData.set('reservation_date', this.reservationDate);
        formData.set('reservation_time', reservationTime);

        await axios.post('{{ request_absolute_uri }}', formData, config).then(function(response) {
            this.availabilityMessage = response.data.message;
        }).catch(function(error) {
            this.availabilityMessage = false;
            console.log(error);
        });
    }
    return this.availabilityMessage;
}
Run Code Online (Sandbox Code Playgroud)

response.data.message从我的框架传回我的True/true,但似乎我没有从await this.handleAvailabilityRequest()函数返回任何东西?当post记录显示我想要的所有内容时,帖子肯定会命中服务器 - 然后在json响应上下文中返回message = true.

所以,我想......帮忙!完全傻眼了,为什么这不起作用,除了它等待承诺的问题......

Cer*_*nce 12

问题出在这里:

await axios.post('{{ request_absolute_uri }}', formData, config).then(function(response){
  this.availabilityMessage = response.data.message;
}).catch(function (error) {
  this.availabilityMessage = false;
  console.log(error);
});
Run Code Online (Sandbox Code Playgroud)

因为你正在使用一个完整的function,你的this内部.then并没有引用实例化的对象.使用箭头函数,以便this从外部范围继承:

await axios.post('{{ request_absolute_uri }}', formData, config)
.then((response) => {
  this.availabilityMessage = response.data.message;
}).catch((error) => {
  this.availabilityMessage = false;
  console.log(error);
});
Run Code Online (Sandbox Code Playgroud)

  • 如果必须使用 function(),则始终可以使用 bind 绑定父上下文 (this)。`function() {}.bind(this)` (2认同)

Vam*_*hna 8

如果您使用异步等待,为什么要使用promises模式.这消除了回调和this绑定丢失的使用

你可以这样做

handleAvailabilityRequest: async function (event) {
  event.preventDefault();
    ...

  try{
   let response =  await axios.post('{{ request_absolute_uri }}', formData, config)
      this.availabilityMessage = response.data.message;
  }catch(error) {
      this.availabilityMessage = false;
      console.log(error);
    };
  }
  return this.availabilityMessage;
}
Run Code Online (Sandbox Code Playgroud)

使用try/catch时可以使用块来处理错误async/await

  • “如果使用异步等待,为什么要使用promise” —因为async函数会返回promise,而await只能等待返回promise的函数。 (3认同)
  • @Quentin我们可以等待该承诺得到解决并返回`response` (2认同)