2016-09-04 4 views
6

Wie kann ich ordnungsgemäß die Schaltfläche Abbrechen, ohne einen Fehler bei der Verwendung von Versprechen zu vermeiden? Mein Code löst eine Warnmeldung mit einem erforderlichen Kontrollkästchen aus. der Code ausgeführt wird, wie es für den Benutzer sollte, aber ein Fehler im Konsolenfenster wirft:Uncaught (im Versprechen) Abbrechen mit SweetAlert2

Uncaught (in Versprechen) abbrechen

//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) { 

    }) 
}); 
+2

Hinweis: Vermeiden Sie die [Promise Konstruktor Antipattern] (http://stackoverflow.com/q/23803743/1048572). – Bergi

+0

Können Sie Ihren Code richtig einrücken? Ich kann nicht erkennen, wo all diese Funktionen enden. – Bergi

+0

Danke @ guest271314 für den Einzug. Es sieht so aus als wäre da ein '})' zu viel. Kannst du bitte deinen vollständigen Code posten? – Bergi

Antwort

19

Update (Januar 2017): Dieses Problem wird in v7 behoben wurde: v7 upgrade guide ↗


Sie benötigen einen Ablehnungs Handler Promise hinzuzufügen. Alternativ können Sie .catch(swal.noop) als eine schnelle Art und Weise verwenden, um einfach die Fehler unterdrücken:

swal('...') 
    .catch(swal.noop); 

PS. Das Paket, das Sie verwenden, heißt SweetAlert , nicht SweetAlert. In zukünftigen Fragen bitte erwähnen Sie es, damit Sie relevantere Antworten erhalten können.

+2

danke, meinen letzten (Platzhalter) '.then' zu '.done zu ändern 'Haben Sie den Trick – Frankenmint

+0

Sie sind herzlich willkommen. Danke, dass du swal2 benutzt hast! –

+0

Uh, 'done' ist ein schrecklicher Name für diese Methode, sie hätte' ignoreDismissals' oder so ähnlich heißen sollen (angenommen, Kündigungen sind der einzige Grund, das Versprechen abzulehnen). Die "done" -Methode macht genau das Gegenteil - werfen unbehandelte Ablehnungen im globalen Kontext - in der 'Q' -Vermögens-Bibliothek und vielen anderen, die davon inspiriert sind. – Bergi

2

new Promise(function(resolve, reject) { nicht notwendig ist. $.post() gibt ein jQuery-Versprechungsobjekt zurück.

Mögliche Lösung ersetzt Promise.reject() für new Promise() Konstruktor; entfernt .then(), die als eine Option auf den ersten swal() Aufruf platziert wurde; Muster scheint zu erwarten, dass ein Promise von preConfirm zurückgegeben wird, obwohl nicht sicher ist, welcher Wert von .done() anders als json_data zurückgegeben werden soll.

+0

"downvote" Beschreibung? – guest271314

+0

Wie löst dies das Problem der nicht abgefangenen Ablehnung? – Bergi

+0

Ihr letzter Satz sollte wahrscheinlich ein Kommentar sein, keine Antwort. – Bergi

7

SweetAlert2 weist das Ergebnisversprechen zurück, wenn die Abbrechen-Taste gedrückt wird. Sie können handle that:

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 etwas nicht mit dem json_data tun müssen, können Sie auch die catch method verwenden könnten.

+1

Es ist SweetAlert2 :) Original SweetAlert wird seit 11 Monaten nicht unterstützt. –

+0

SweetAlert2 lehnt Versprechungen nicht standardmäßig ab v7 ab: https://github.com/sweetalert2/sweetalert2/releases/tag/v7.0.0 –

Verwandte Themen