J'ai un peu de mal à régler l'un de mes problèmes. valeurs dans mon application Vue.js. Je crois que je ne comprends pas correctement les appels asynchrones axios ou bien comment async fonctionne dans Vue.js.
J'ai les trois méthodes suivantes:
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;
}
Mon response.data.message
Est renvoyé de mon framework en tant que True/true, mais il semble que je ne renvoie rien de la fonction await this.handleAvailabilityRequest()
? La publication frappe définitivement le serveur car la journalisation montre tout ce que je veux - puis retourne message = true dans un contexte de réponse json.
Alors, je suppose ... aidez-moi! Complètement abasourdi quant à savoir pourquoi cela ne fonctionne pas si ce n’est un problème pour attendre la promesse ...
Le problème est ici:
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);
});
Parce que vous utilisez un function
à part entière, votre this
à l'intérieur du .then
ne fait pas référence à l'objet instancié. Utilisez plutôt une fonction de flèche pour que le this
soit hérité de la portée externe:
await axios.post('{{ request_absolute_uri }}', formData, config)
.then((response) => {
this.availabilityMessage = response.data.message;
}).catch((error) => {
this.availabilityMessage = false;
console.log(error);
});
Pourquoi utiliser le modèle de promesses si vous utilisez async attendre. Cela supprime l'utilisation des rappels et de la perte de la liaison this
Tu peux le faire comme ça
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;
}
Vous pouvez utiliser try/catch
bloc pour la gestion des erreurs lors de l'utilisation de async/await