Nicht gefangener (versprochener) Abbruch mit SweetAlert2
Lesezeit: 5 Minuten
Frankenminze
Wie entkomme ich der Abbrechen-Schaltfläche richtig, ohne einen Fehler bei der Verwendung von Versprechungen auszulösen? Mein Code löst eine Warnbestätigung mit einem erforderlichen Kontrollkästchen aus. Der Code wird für den Benutzer ordnungsgemäß ausgeführt, gibt jedoch einen Fehler im Konsolenfenster aus:
Ungefangen (versprochen) stornieren
//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) {
})
});
Hinweis: Vermeiden Sie das Antimuster des Promise-Konstruktors.
– Bergi
4. September 2016 um 21:27 Uhr
Können Sie bitte Ihren Code richtig einrücken? Ich kann nicht erkennen, wo all diese Funktionen enden.
– Bergi
4. September 2016 um 21:31 Uhr
Danke @guest271314 für den Einzug. Es sieht so aus, als gäbe es eine Schließung }) zu viel. Kannst du bitte deinen vollständigen Code posten?
– Bergi
4. September 2016 um 21:47 Uhr
@Bergi Ich habe versucht, mehr Code hinzuzufügen, weiß aber nicht, wie ich dies tun soll, ohne die Dinge zu verkomplizieren. Ich brauche dort das Versprechen, meine Checkbox-Logik zu handhaben, bevor ich meine Formulardaten zur Verarbeitung übertrage
– Frankenminze
4. September 2016 um 21:57 Uhr
@Bergi ja, ich benutze limonte.github.io/sweetalert2ich kann in den Dokumenten anscheinend nicht finden, wie man “Stornieren” bei einer Bestätigung mit Versprechen abdeckt
– Frankenminze
4. September 2016 um 22:18 Uhr
Limon Monte
Aktualisierung (Januar 2017): Dieses Problem wurde in v7 behoben: v7-Upgrade-Leitfaden ↗
Sie müssen dem Promise einen Rejection Handler hinzufügen. Alternativ können Sie verwenden .catch(swal.noop) als schnelle Möglichkeit, die Fehler einfach zu unterdrücken:
swal('...')
.catch(swal.noop);
PS. Das Paket, das Sie verwenden, heißt SweetAlert2, nicht SweetAlert. Bitte erwähnen Sie es in zukünftigen Fragen, damit Sie relevantere Antworten erhalten.
Danke, ich ändere mein Finale (Platzhalter) .then zu .done hat es geschafft
– Frankenminze
4. September 2016 um 22:53 Uhr
Äh, done ist ein schrecklicher Name für diese Methode, sie hätte heißen sollen ignoreDismissals oder so ähnlich (unter der Annahme, dass Entlassungen der einzige Grund für die Ablehnung des Versprechens sind). Das done Methode tut genau das Gegenteil – wirft unbehandelte Ablehnungen in den globalen Kontext – in die Q Promise Library und viele andere davon inspiriert.
– Bergi
4. September 2016 um 23:00 Uhr
@Bergi .done()wurde ersetzt durch .catch(swal.noop)Danke für deine Meinung.
– Limon Monte
31. Oktober 2016 um 11:07 Uhr
Bergi
SweetAlert2 lehnt das Ergebnisversprechen ab, wenn der Abbrechen-Button gedrückt wird. Du kannst Regle dies:
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;
}
})
Wenn Sie mit dem nichts zu tun haben json_dataSie können auch die verwenden catch Methode.
Es ist SweetAlert2 🙂 Original SweetAlert wird bereits seit 11 Monaten nicht mehr unterstützt.
new Promise(function(resolve, reject) { ist nicht nötig. $.post() gibt ein jQuery Promise-Objekt zurück.
Mögliche Ersatzlösungen Promise.reject() zum new Promise() Konstrukteur; ENTFERNT .then() das wurde als erste Option platziert swal() Anruf; Muster scheint a zu erwarten Promise von zurückgegeben werden preConfirmobwohl nicht sicher ist, welcher Wert zurückgegeben werden soll .done() außer json_data.
Wie löst dies das Problem der unabgefangenen Zurückweisung?
– Bergi
4. September 2016 um 21:31 Uhr
Ihr letzter Satz sollte wahrscheinlich ein Kommentar sein, keine Antwort.
– Bergi
4. September 2016 um 21:32 Uhr
@Bergi “Wie löst dies das Problem der unabgefangenen Zurückweisung?” Erstens, indem Sie vorschlagen, unnötige zu entfernen Promise Konstrukteur. “Ihr letzter Satz sollte wahrscheinlich ein Kommentar sein, keine Antwort.” Nicht sicher, ob der Fehler auf nicht erfasstes undefiniertes zurückzuführen ist result? Wird eine Minute dauern, um die Neuordnung zu klären $.post(), .done(), .then() und auf andere mögliche Fehler zu prüfen.
– Gast271314
4. September 2016 um 21:39 Uhr
Bezüglich “// return ?“: Nein, das kannst du nicht return von einem done zurückrufen. Wenn es ein then Rückruf kann sinnvoll sein.
– Bergi
4. September 2016 um 21:56 Uhr
Sie haben nach einer “Downvote-Beschreibung” gefragt, also habe ich es erklärt. Antworten sollten in sich geschlossen sein, sie sind kein Kommunikationsmedium (wie Kommentare). Sie sollten die Frage aus der ersten geposteten Version beantworten. Ich hatte das Gefühl, dass Ihr Beitrag keine Lösung für das Problem enthielt, also habe ich die Schaltfläche “nicht nützlich” verwendet.
– Bergi
4. September 2016 um 22:18 Uhr
Sie müssen die Aktion zum Abbrechen abfangen
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
}
})
Info
catch(swal.noop) hinzufügen; Am Ende wird die Swal-Funktion dieses Problem lösen
Zum Beispiel:
swal({
}).then(function() {
}).catch(swal.noop);
14042100cookie-checkNicht gefangener (versprochener) Abbruch mit SweetAlert2yes
Hinweis: Vermeiden Sie das Antimuster des Promise-Konstruktors.
– Bergi
4. September 2016 um 21:27 Uhr
Können Sie bitte Ihren Code richtig einrücken? Ich kann nicht erkennen, wo all diese Funktionen enden.
– Bergi
4. September 2016 um 21:31 Uhr
Danke @guest271314 für den Einzug. Es sieht so aus, als gäbe es eine Schließung
})
zu viel. Kannst du bitte deinen vollständigen Code posten?– Bergi
4. September 2016 um 21:47 Uhr
@Bergi Ich habe versucht, mehr Code hinzuzufügen, weiß aber nicht, wie ich dies tun soll, ohne die Dinge zu verkomplizieren. Ich brauche dort das Versprechen, meine Checkbox-Logik zu handhaben, bevor ich meine Formulardaten zur Verarbeitung übertrage
– Frankenminze
4. September 2016 um 21:57 Uhr
@Bergi ja, ich benutze limonte.github.io/sweetalert2ich kann in den Dokumenten anscheinend nicht finden, wie man “Stornieren” bei einer Bestätigung mit Versprechen abdeckt
– Frankenminze
4. September 2016 um 22:18 Uhr