未使用(承诺)取消使用SweetAlert2
如何在使用promises时正确转义取消按钮而不会抛出错误? 我的代码会抛出一个带有必填复选框的警报确认。 代码应该对用户执行,但它会在控制台窗口中引发错误:
未被捕(承诺)取消
//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 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 = "
Approved" + data_array["approved"] + "" + "
Details Code: " + data_array["detailsCode"] + ""; } swal({ type: resulting, title: details, html: "Details:
" + data_array["messagetext"] + moreDetails }); } ); resolve(); } else { reject('You must agree to our Terms & Conditions '); } }); }, allowOutsideClick: false }).then(function(json_data) { }) });
更新(2017年1月):此问题已在v7: v7升级指南 fixed中修复
您需要向Promise添加拒绝处理程序。 或者,您可以使用.catch(swal.noop)
作为简单抑制错误的快速方法:
swal('...') .catch(swal.noop);
PS。 你正在使用的包叫做SweetAlert 2 ,而不是SweetAlert。 在将来的问题中,请提及它,以便您可以获得更多相关答案。
按下取消按钮时,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
执行任何json_data
,那么您也可以使用catch
方法 。
new Promise(function(resolve, reject) {
不是必需的。 $.post()
返回一个jQuery promise对象。
可能的解决方案将Promise.reject()
替换为new Promise()
构造函数; 删除swal()
作为第一个swal()
调用的选项; 模式似乎期望从preConfirm
返回preConfirm
,但不确定preConfirm
,从.done()
返回的值是json_data
。
swal({ title: "Confirm", input: 'checkbox', inputValue: 0, type: "warning", inputPlaceholder: 'I agree to ', 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 = "
Approved" + data_array["approved"] + "" + "
Details Code: " + data_array["detailsCode"] + ""; } swal({ type: resulting, title: details, html: "Details:
" + data_array["messagetext"] + moreDetails }); } ); } else { return Promise.reject('You must agree to our Terms & Conditions '); } }, allowOutsideClick: false });
你需要抓住取消的动作
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 } })