comment puis-je échapper correctement au bouton d'annulation sans générer d'erreur lors de l'utilisation des promesses? Mon code envoie une confirmation d'alerte avec une case à cocher obligatoire. le code s'exécute comme il se doit pour l'utilisateur, mais une erreur est générée dans la fenêtre de la console:
Non pris (promis) annuler
//validation logic all passes...Now proceed to...
else
{
//determine and parse Discounts
var myLookup = document.getElementsByName("myLookup")[0].value;
$.post( "findthem.php", {myLookup: myLookup })
.done(function(json_data){
var theResponse1 = $.parseJSON(json_data);
myDiscountRate = theResponse1['ourDiscountFound'];
}).then( function(callback){
priceRate = priceRate * (1 - (.01 * myDiscountRate));
newRate = priceRate.toFixed(2);
}
swal({
title: "Confirm",
input: 'checkbox',
inputValue: 0,
type: "warning",
inputPlaceholder: 'I agree to <a href="#blahblahMore"></a> Your new Rate is :'+newRate,
showCancelButton: true,
confirmButtonText: 'Confirm',
showLoaderOnConfirm: true,
preConfirm: function(result) {
return new Promise(function(resolve, reject) {
if (result) {
$.post("my.php", {
Data: data
})
.done(
function(json_data) {
var data_array = $.parseJSON(json_data);
var moreDetails = '';
var resulting = 'error';
var details = "Transaction Declined"
if (data_array["trxApproved"] == true) {
resulting = 'success';
details = "Confirmed"
moreDetails = "<br>Approved<b>" + data_array["approved"] + "</b>" +
"<br>Details Code: <b>" + data_array["detailsCode"] + "</b>";
}
swal({
type: resulting,
title: details,
html: "<h1>Details: </h1>" + data_array["messagetext"] + moreDetails
});
}
);
resolve();
} else {
reject('You must agree to our Terms & Conditions ');
}
});
},
allowOutsideClick: false
}).then(function(json_data) {
})
});
Mise à jour (janvier 2017): Ce problème a été corrigé dans la v7: Guide de mise à niveau de la v7 ↗
Vous devez ajouter un gestionnaire de rejet à la promesse. Vous pouvez également utiliser .catch(swal.noop)
comme moyen rapide de supprimer les erreurs:
swal('...')
.catch(swal.noop);
PS. le paquet que vous utilisez s'appelle SweetAlert2, pas SweetAlert. Dans les questions futures, veuillez le mentionner pour obtenir des réponses plus pertinentes.
SweetAlert2 rejette la promesse de résultat lorsque le bouton d'annulation est enfoncé. Vous pouvez gérer cela :
swal({
…
}).then(function(json_data) {
…
}, function(dismiss) {
if (dismiss === 'cancel') { // you might also handle 'close' or 'timer' if you used those
// ignore
} else {
throw dismiss;
}
})
Si vous n'avez rien à faire avec le json_data
, vous pouvez également utiliser la méthode catch
.
new Promise(function(resolve, reject) {
n'est pas nécessaire. $.post()
renvoie un objet de promesse jQuery.
La solution possible substitue Promise.reject()
pour le constructeur new Promise()
; .then()
supprimé qui a été placé en tant qu'option pour le premier appel swal()
; modèle semble s'attendre à ce que Promise
soit renvoyé de preConfirm
, bien que nous ne sachions pas quelle valeur on attend de .done()
autre que json_data
.
swal({
title: "Confirm",
input: 'checkbox',
inputValue: 0,
type: "warning",
inputPlaceholder: 'I agree to <a href="#blahblahMore"></a>',
showCancelButton: true,
confirmButtonText: 'Confirm',
showLoaderOnConfirm: true,
preConfirm: function(result) {
if (result) {
return $.post("my.php", {
Data: data
})
.done(
function(json_data) {
var data_array = $.parseJSON(json_data);
var moreDetails = '';
var resulting = 'error';
var details = "Transaction Declined"
if (data_array["trxApproved"] == true) {
resulting = 'success';
details = "Confirmed"
moreDetails = "<br>Approved<b>" + data_array["approved"] + "</b>" +
"<br>Details Code: <b>" + data_array["detailsCode"] + "</b>";
}
swal({
type: resulting,
title: details,
html: "<h1>Details: </h1>" + data_array["messagetext"] + moreDetails
});
}
);
} else {
return Promise.reject('You must agree to our Terms & Conditions ');
}
},
allowOutsideClick: false
});
vous devrez attraper l'action pour annuler
swal({
title: 'Are you sure?',
text: "You won't be able to revert this!",
type: 'warning',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: 'Yes, delete it!'
}).then(function(json_data) {
//delete item
}, function(dismiss) {
if (dismiss === 'cancel' || dismiss === 'close') {
// ignore
}
})
Ajout de prise (swal.noop); à la fin, la fonction swal résoudra ce problème
Par exemple:
swal({
}).then(function() {
}).catch(swal.noop);