2016-09-04 18 views
6

Jak poprawnie opuścić przycisk anulowania bez rzucania błędu podczas korzystania z obietnic? Mój kod generuje potwierdzenie alertu z wymaganym polem wyboru. kod wykonywany tak jak powinno do użytkownika, ale zgłasza błąd w oknie konsoli:Nieuczciwie (w obietnicy) anuluj, używając SweetAlert2

Uncaught (obietnicy) anulować

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

Podpowiedź: unikaj [konstruktora Promesa antipattern] (http://stackoverflow.com/q/23803743/1048572). – Bergi

+0

Czy możesz poprawnie wstawić swój kod? Nie mogę stwierdzić, gdzie kończą się te wszystkie funkcje. – Bergi

+0

Dzięki @ guest271314 za wcięcie. Wygląda na to, że jest zamykanie '})' zbyt wiele. Czy możesz opublikować swój pełny kod? – Bergi

Odpowiedz

19

Update (styczeń 2017): Ten problem został rozwiązany w v7: v7 upgrade guide ↗


Trzeba dodać obsługi odrzucenia obietnicy. Alternatywnie, można użyć .catch(swal.noop) jako szybki sposób, aby po prostu zlikwidować błędy:

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

PS. pakiet, którego używasz nazywa się SweetAlert , a nie SweetAlert. W przyszłych pytaniach wspomnij o tym, aby uzyskać bardziej trafne odpowiedzi.

+2

dziękuję, zmieniając mój końcowy (symbol zastępczy) '.then' na' .done 'zrobiłem sztuczkę – Frankenmint

+0

Proszę bardzo. Dziękujemy za skorzystanie z usługi swal2! –

+0

Uh, 'done' to okropna nazwa dla tej metody, powinna była zostać nazwana' ignoreDismissals' lub coś podobnego (zakładając, że zwolnienia są jedyną przyczyną odrzucenia obietnicy). Metoda "done" robi coś wręcz przeciwnego - rzuca nieobsłużone odrzucenia w kontekście globalnym - w bibliotece obietnic 'Q' i wielu innych inspirowanych przez nią. – Bergi

2

new Promise(function(resolve, reject) { nie jest konieczne. $.post() zwraca obiekt obietnicy jQuery.

Możliwe substytuty rozwiązania Promise.reject() dla konstruktora new Promise(); usunięto .then(), która została umieszczona jako opcja pierwszego połączenia swal(); Wydaje się, że wzorzec oczekuje się, że Promise zostanie zwrócony z preConfirm, ale nie jest pewien, jakiej wartości oczekuje się zwrócić od .done() innej niż 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 
}); 
+0

"downvote" opis? – guest271314

+0

W jaki sposób rozwiązuje to problem nierozstrzygniętego odrzucenia? – Bergi

+0

Twoje ostatnie zdanie powinno być prawdopodobnie komentarzem, a nie odpowiedzią. – Bergi

7

SweetAlert2 odrzuca obietnicę wyniku po naciśnięciu przycisku Anuluj. Można 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; 
    } 
}) 

Jeśli nie trzeba robić nic z json_data, można również użyć catch method.

+1

To SweetAlert2 :) Oryginalny SweetAlert nie jest obsługiwany przez już 11 miesięcy. –

+0

SweetAlert2 domyślnie nie odrzuca obietnic począwszy od wersji 7: https://github.com/sweetalert2/sweetalert2/releases/tag/v7.0.0 –