Uncaught (в обещании) отменить с помощью SweetAlert2

как мне правильно избежать кнопки отмены, не выдавая ошибку при использовании промисов? Мой код выдает подтверждение предупреждения с обязательным флажком. код выполняется так, как должен для пользователя, но выдает ошибку в окне консоли:

Uncaught (в обещании) отменить

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

  })
});

person Frankenmint    schedule 04.09.2016    source источник
comment
Подсказка: избегайте антишаблона конструктора Promise.   -  person Bergi    schedule 05.09.2016
comment
Не могли бы вы сделать правильный отступ в коде? Я не могу понять, где заканчиваются все эти функции.   -  person Bergi    schedule 05.09.2016
comment
Спасибо @guest271314 за отступ. Похоже, закрытия }) слишком много. Не могли бы вы опубликовать свой полный код?   -  person Bergi    schedule 05.09.2016
comment
@Bergi Я пытался добавить больше кода, но не знаю, как это сделать, не усложняя вещи, мне нужно обещание, чтобы обработать логику моего флажка, прежде чем отправлять данные формы в обработку   -  person Frankenmint    schedule 05.09.2016
comment
Спасибо, хотя кажется, что все еще } слишком много (после расчета newRate). В качестве альтернативы вы могли бы просто удалить }) в конце, если вызов then, к которому он принадлежит, не имеет отношения к вопросу.   -  person Bergi    schedule 05.09.2016
comment
@Frankenmint У вас есть документы о том, что делают обратные вызовы sweetalert? Вы используете одну из вилок?   -  person Bergi    schedule 05.09.2016
comment
@Bergi, да, я использую limonte.github.io/sweetalert2, я не могу найдите в документах, как скрыть «отмену» при подтверждении с помощью обещаний   -  person Frankenmint    schedule 05.09.2016
comment
Спасибо за ссылку, нашел для вас :-)   -  person Bergi    schedule 05.09.2016
comment
Очень простое решение: обновите файл и попробуйте использовать обновленный sweetalert.min.js. я столкнулся с тем же, но после обновления я исправил это. sweetalert.js.org/guides/#installation   -  person pankaj kumar    schedule 21.12.2020


Ответы (5)


Обновление (январь 2017 г.): эта проблема устранена в версии 7: руководство по обновлению v7 ​​↗


Вам нужно добавить обработчик отклонения в обещание. В качестве альтернативы вы можете использовать .catch(swal.noop) как быстрый способ просто подавить ошибки:

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

PS. используемый вами пакет называется SweetAlert2, а не SweetAlert. В будущих вопросах, пожалуйста, укажите это, чтобы вы могли получить более релевантные ответы.

person Limon Monte    schedule 04.09.2016
comment
спасибо, изменение моего последнего (заполнителя) .then на .done помогло - person Frankenmint; 05.09.2016
comment
Мм, done — ужасное название для этого метода, его следовало бы назвать ignoreDismissals или как-то так (при условии, что увольнения — единственная причина отклонения обещания). Метод done делает прямо противоположное — выдает необработанные отклонения в глобальном контексте — в библиотеке промисов Q и во многих других, вдохновленных им. - person Bergi; 05.09.2016
comment
@Bergi .done() был заменен на .catch(swal.noop), спасибо за ваше мнение. - person Limon Monte; 31.10.2016

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метод.

person Bergi    schedule 04.09.2016
comment
Это SweetAlert2 :) Оригинальный SweetAlert не поддерживается уже 11 месяцев. - person Limon Monte; 05.09.2016
comment
SweetAlert2 не отклоняет обещания по умолчанию, начиная с версии 7: github.com/sweetalert2/ sweetalert2/релизы/тег/v7.0.0 - person Limon Monte; 24.01.2018

new Promise(function(resolve, reject) { не нужно. $.post() возвращает объект обещания jQuery.

Возможное решение заменяет Promise.reject() на new Promise() конструктор; удалено .then(), которое было помещено как опция к первому вызову swal(); шаблон, по-видимому, ожидает, что Promise будет возвращено из preConfirm, хотя не уверен, какое значение ожидается, что .done() будет возвращено, кроме 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
});
person guest271314    schedule 04.09.2016
comment
Как это решает проблему неперехваченного отказа? - person Bergi; 05.09.2016
comment
Ваше последнее предложение, вероятно, должно быть комментарием, а не ответом. - person Bergi; 05.09.2016
comment
@Bergi Как это решает проблему необработанного отклонения? Во-первых, предлагая удалить ненужный конструктор Promise. Ваше последнее предложение, вероятно, должно быть комментарием, а не ответом. Не уверен, что ошибка связана с неперехваченным undefined result? Потребуется минута, чтобы разобраться с перестановкой $.post(), .done(), .then() и проверить наличие других возможных ошибок. - person guest271314; 05.09.2016
comment
Таким образом, ваше решение состоит в том, чтобы удалить нативные промисы, потому что jQuery не отслеживает необработанные отказы, вместо того, чтобы исправлять основную причину!? - person Bergi; 05.09.2016
comment
@Bergi Итак, ваше решение состоит в том, чтобы удалить собственные промисы, поскольку jQuery не отслеживает необработанные отказы, а не устраняет основную причину!? Как вы пришли к такому выводу? Только заявил, что конструктор Promise не нужен. Все еще просматриваю javascript; есть .then(), который определяется как вариант вызова swal вместо того, чтобы быть привязанным к .done(). В настоящее время переставляет javascript из исходного вопроса. Замечено result определено - person guest271314; 05.09.2016
comment
Если все, что вы хотели заявить, это то, что конструктор Promise не нужен в коде (что правильно), не решая проблему вопроса, вы должны были опубликовать комментарий, а не ответ. Я сделал вывод, потому что обычно ответы пытаются ответить на вопрос, а ваш в настоящее время нет. - person Bergi; 05.09.2016
comment
@Bergi Если все, что вы хотели указать, конструктор Promise не нужен в коде, не решая проблему вопроса, вы должны были опубликовать комментарий, а не ответ. О чем вы говорите? ? Конечно, постараюсь исправить проблемы с существующим javascript. Упомянутые выше комментарии проверяли другие возможные ошибки. Разместим возможное решение через несколько секунд - person guest271314; 05.09.2016
comment
Вам просто нужно подождать с публикацией ответа, пока вы не найдете фактическую ошибку. - person Bergi; 05.09.2016
comment
Относительно // return ?: нет, вы не можете return из обратного вызова done. Если бы это был обратный вызов then, это могло бы иметь смысл. - person Bergi; 05.09.2016
comment
@Bergi Вы просто должны подождать с публикацией ответа, пока не найдете настоящую ошибку. Правда? При всем уважении, это не по правилам. Вы действительно собираетесь советовать другому пользователю, когда и как публиковать ответ на вопрос? Как будто вы не редактировали ни один из ваших собственных ответов? Нет, вы не можете вернуться после обратного вызова. Если бы это был обратный вызов then, это могло бы иметь смысл. Да, избегайте использования .done() здесь, за исключением передачи массива функций для вызова. Смотрите обновленный пост - person guest271314; 05.09.2016
comment
@Bergi Удалена ссылка на возможное return в .done() - person guest271314; 05.09.2016
comment
Вы просили дать описание отрицательного ответа, поэтому я объяснил это. Ответы должны быть автономными, они не являются средством коммуникации (как и комментарии). Они должны ответить на вопрос из первой опубликованной версии. Я чувствовал, что ваш пост не содержит решения проблемы, поэтому я использовал бесполезную кнопку. - person Bergi; 05.09.2016
comment
@Берги Достаточно честно. Хотя Они должны ответить на вопрос из первой опубликованной версии. трудно последовательно и практически достичь; пользователь может добавлять требования к Вопросу или комментариям, Ответ может быть улучшен пользователем, который публикует Ответ. Если бы этого придерживались, на SO не было бы отредактированных ответов. Все еще не знаете, где возникает ошибка? Разве allowOutsideClick: false }).then(function(json_data) { }) не сгенерировал ошибку? - person guest271314; 05.09.2016

вам нужно будет поймать действие для отмены

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
  } 
})
person Adeojo Emmanuel IMM    schedule 11.10.2018

Добавляем catch(swal.noop); в конце функция swal решит эту проблему

Например:

swal({

}).then(function() {

}).catch(swal.noop);
person kishore ms    schedule 08.01.2019