Nicht gefangener (versprochener) Abbruch mit SweetAlert2

Lesezeit: 5 Minuten

Benutzeravatar von Frankenmint
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

Benutzeravatar von Limon Monte
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

Benutzeravatar von Bergi
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.

    – Limon Monte

    4. September 2016 um 22:45 Uhr

  • SweetAlert2 lehnt Versprechen ab Version 7 nicht mehr standardmäßig ab: github.com/sweetalert2/sweetalert2/releases/tag/v7.0.0

    – Limon Monte

    24. Januar 2018 um 8:37 Uhr

Benutzeravatar von guest271314
Gast271314

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.

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
});

  • 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
  } 
})

Benutzeravatar von Infy
Info

catch(swal.noop) hinzufügen; Am Ende wird die Swal-Funktion dieses Problem lösen

Zum Beispiel:

swal({

}).then(function() {

}).catch(swal.noop);

1404210cookie-checkNicht gefangener (versprochener) Abbruch mit SweetAlert2

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy