web-dev-qa-db-ja.com

SweetAlert2を使用した(約束された)キャッチされないキャンセル

約束を使用するときにエラーをスローせずにキャンセルボタンを適切にエスケープするにはどうすればよいですか?私のコードは、必要なチェックボックスが付いたアラート確認をスローします。コードはユーザーに実行されるはずですが、コンソールウィンドウでエラーがスローされます。

キャッチされない(約束)キャンセル

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

  })
});
15
Frankenmint

更新(2017年1月):この問題はv7で修正されました: v7アップグレードガイド↗


Promiseに拒否ハンドラーを追加する必要があります。または、.catch(swal.noop)を使用して、エラーを単純に抑制する簡単な方法として使用できます。

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

PS。使用しているパッケージは、SweetAlertではなく、SweetAlert2と呼ばれます。今後の質問では、より関連性の高い回答を得ることができるようにそれを言及してください。

35
Limon Monte

SweetAlert2は、キャンセルボタンが押されると結果プロミスを拒否します。 それを処理する

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

json_dataで何もする必要がない場合は、 catch method も使用できます。

14
Bergi

new Promise(function(resolve, reject) {は必要ありません。 $.post()はjQuery promiseオブジェクトを返します。

可能な解決策は、Promise.reject()コンストラクタをnew Promise()に置き換えます。最初の.then()呼び出しのオプションとして配置されたswal()を削除しました。パターンは、PromiseからpreConfirmが返されることを期待しているように見えますが、_json_data_以外の.done()から返される値は不明です。

_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
});
_
4
guest271314

キャンセルのアクションをキャッチする必要があります

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

Catch(swal.noop)の追加;最後にswal関数はこの問題を解決します

例えば:

swal({

}).then(function() {

}).catch(swal.noop);
1
kishore ms