SweetAlert2 и обещания

Я пытаюсь использовать SweetAlert2, но у меня возникают проблемы с отображением сообщений об ошибках, когда что-то идет не так. Кроме того, когда пользователь нажимает кнопку «Отмена», в консоли отображается ошибка: Uncaught (in promise) cancel.

Короче говоря, на моем сайте есть кнопка. Если пользователь нажимает эту кнопку, появляется диалоговое окно подтверждения (используя SweetAlert2). Вот мой код:

swal({
    title: "Are you sure?",
    text: "You will not be able to undo this action!",
    type: "warning",
    showCancelButton: true,
    cancelButtonText: 'No, cancel!',
    confirmButtonColor: "#DD6B55",
    confirmButtonText: "Yes, do it!",
    allowOutsideClick: false
    preConfirm: function () {
        return axios.put('/api/endpoint')
        .then(response => {
            console.log('success')
        })
        .catch(error => {
            console.log('failure')
            swal({
                title: "Something went wrong",
                type: "error",
            })
        });
    }
}).then(function (result) {
    if (result.value) {
        swal('Deleted!', 'Your file has been deleted.', 'success')
    } else if (result.dismiss === 'cancel') {
        swal('Cancelled', 'Your file is safe :)', 'error')
    }
});

Если что-то пойдет не так, было бы неплохо отобразить еще одно диалоговое окно SweetAlert2 с сообщением «Что-то пошло не так», но вместо этого кажется, что SweetAlert2 каким-то образом перехватывает ошибку и отображает ее в том же окне подтверждения. Также есть проблема с кнопкой отмены: если пользователь отменяет, в консоли отображается уже упомянутая ошибка.

SweetAlert2 использует обещания, и я все еще учусь правильно их использовать, поэтому, возможно, я что-то делаю не так.

Любая помощь, пожалуйста?

заранее спасибо


person TJ is too short    schedule 18.11.2017    source источник
comment
Я никогда не использовал swaI, но, судя по тому, что я вижу на их сайте, я думаю, что вы должны поймать и обработать ошибку вызова axios вне preconfirm.   -  person caisah    schedule 18.11.2017
comment
Уже пытался это сделать, но, к сожалению, ошибка каким-то образом перехватывается библиотекой и отображается в том же окне подтверждения (позволяя пользователю щелкать снова, снова и снова). Идеальный порядок действий будет таким: Щелчок -> Подтверждение -> Запрос Axios -> если ошибка, показать другое предупреждение: Произошла ошибка   -  person TJ is too short    schedule 18.11.2017
comment
Какая версия sweetalert2?   -  person trincot    schedule 18.11.2017
comment
Как сказал caisah, вам действительно следует переместить catch во внешнюю цепочку обещаний. Кажется, он отлично работает на jsfiddle   -  person trincot    schedule 18.11.2017
comment
Большое спасибо, ребята! Проблема в той версии, которую я использую (6.6.6). Тот, что используется в jsfiddle (7.0.0), работает как шарм.   -  person TJ is too short    schedule 18.11.2017


Ответы (1)


Я только что впервые закончил возиться с обещаниями внутри SWAL2 и благодаря этому добился серьезных успехов в улучшении части UX моего веб-приложения. Я много использовал модальные окна SWAL2 и обнаружил, что промисы лучше всего работают, когда пользователь вводит данные внутри модального окна SWAL и проверяет этот ввод.

Я использую JQuery 3.2.1 и PHP версии 5.6.

Это первый способ сделать то, что делаю я, поэтому, пожалуйста, не думайте, что он точно подойдет для вашего проекта. Я все еще немного тестирую, так что имейте это в виду.

Моя общая цель состояла в том, чтобы заставить пользователей вводить остальную информацию, которая мне нужна от них, после того, как они впервые войдут в свой профиль (и/или у них есть пустые поля для необходимых значений базы данных).

Вот основа того, что я использую Promises и Ajax для выполнения на макроуровне:

swal({...}).then(function(result){ //introduction modal

    swal({...}).then(function(result){ //start getting required info

        swal({...}).then(function(result){ //get some more required info

        }, function (dismiss) {}).catch(swal.noop);

    }, function (dismiss) {}).catch(swal.noop);

}, function (dismiss) {}).catch(swal.noop);

У каждого из этих модальных окон есть разные входные данные, которые мне нужны и которые мне нужно проверить, за исключением первого.

swal({
    html:'Welcome to my web app!',
    imageUrl: '../path-to-image.png',
    imageWidth: 350,
    imageAlt: 'My Logo',
    animation: false,
    showCancelButton: false,
    confirmButtonColor: '#3085d6',
    cancelButtonColor: '#d33',
    confirmButtonText: 'Complete My Profile',
    cancelButtonText: 'Cancel',
    confirmButtonClass: 'btn btn-success',
    cancelButtonClass: 'btn btn-danger',
    buttonsStyling: false,
    focusConfirm: false
    }).then(function(result) {

После моего приветствия «Добро пожаловать в веб-приложение XYZ» я сразу же начинаю свой следующий модальный режим. это супер просто. Либо вызовите следующее модальное окно, если пользователь нажмет единственную зеленую кнопку, которую он может нажать, либо отобразите другое модальное окно, если он закроется, щелкнув его. Мой код продолжается:

swal({
    title: 'Your Basic Information',
    html:
    '<div class="form-group"><input type="text" class="form-control" id="FName" name="FName" placeholder="Last Name"></div>'+
    '<div class="form-group"><input type="text" class="phone_us form-control" maxlength="14" data-mask="(000) 000-0000" id="userPhone" name="userPhone" placeholder="Phone Number"></div>'+
    '<div class="form-group"><div class="input-group"><span class="input-group-addon">$</span><input type="text" class="money form-control" id="avgPrice" name="avgPrice" data-mask="#,##0.00" data-mask-reverse="true" maxlength="5" placeholder="Average Price of your Advice"/></div></div>'+
    '<div class="form-group"><textarea class="form-control" name="FInfo" id="FInfo" rows="6" placeholder="Give people a summary of who you are and what kind of great stuff you can do for them."></textarea></div>'+
    '<div class="form-group"><label for="FType">Type of kitchen</label><select class="form-control" name="FType" id="FType"><option>--Select--</option><option>Type 1</option><option>Type 2</option><option>Type 3</option><option>Type 4</option><option>Type 5</option></select></div>',
    showCancelButton: false,
    confirmButtonColor: '#3085d6',
    cancelButtonColor: '#d33',
    confirmButtonText: 'Update and Continue',
    cancelButtonText: 'Cancel',
    confirmButtonClass: 'btn btn-success',
    cancelButtonClass: 'btn btn-danger',
    buttonsStyling: false,
    focusConfirm: false,
    preConfirm: function () {

    //Set our Ajax variables in the start of preConfirm
    //We could've just made a form element as part of the html, and used a FormData class or form_name.serialize(). The current way is for illustration.
    var userPhone = $('#userPhone').val(), FName = $('#FName').val(), avgPrice = $('#avgPrice').val(), FInfo = $('#FInfo').val(), FType = $('#FType').val(), retData = [];

Все перечисленные выше переменные являются входными значениями, кроме retData. retData — это массив, который будет использоваться для хранения строк ошибок, которые я получаю от PHP. Затем я могу указать JQuery выполнить итерацию по массиву и отобразить эти ошибки в виде всплывающих уведомлений. Есть способы сделать это с помощью JSON, да.

А вот и мясо и картошка того, к чему я пытаюсь добраться. Теперь мы можем использовать Promise, чтобы продолжать выполнять наш Ajax-запрос при каждом щелчке пользователя и оставлять модальное окно открытым до тех пор, пока не будет выполнено определенное условие (вся информация проверена и нет ошибок).

return new Promise(function (resolve) {
    //Run our actual ajax request inside the promise. Keeps the SWAL2 modal open
    $.ajax({
    url: prefix+'settings_val_first_modal.php',
    type: 'POST',
    data: ({userPhone: userPhone, FName: FName, avgPrice: avgPrice, FInfo: FInfo, FType: FType}),
    success: function(show) {

        retData.push.apply(retData, show.split(","));

        //Define the condition that keeps us in the promise.

        if(Number(retData[0]) === 0){

            //Remove the zero from our error array
            retData.shift();

            $.each(retData, function(i, val){

                //Display each array element as separate toastr notification
                toastr.error(retData[i]);

            });

        } else{

            //Define the condition that breaks us out of the promise
            resolve(true);

        }
    }
  });
});
}

Затем, как только это условие выполнено, мы можем двигаться дальше по модальной цепочке, используя

}).then(function(result){

и делаем все, что захотим после этого, например, добавляем еще один swal для загрузки изображения или говорим спасибо пользователю с другим swal.

swal('You\'re all finished!','You now have full access to XYZ web app!','success');

затем мы обязательно определяем нашу функцию отклонения для нашего второго модального окна. В моем случае модальное окно с информацией:

}, function (dismiss) {
// dismiss can be 'cancel', 'overlay',
// 'close', and 'timer'
    if (dismiss === 'overlay') {
        swal(
            'Please Finish Your Profile',
            'You need to have a completed profile before you can start using XYZ web application',
            'info'
        );
    }
}).catch(swal.noop);

И вот оно. Я знаю, что это довольно длинное объяснение, но я считаю, что такое использование наиболее подходит для обещаний и SWAL2. Завершая код, нам нужно определить случай, когда первое модальное окно закрывается.

}, function (dismiss) {
// dismiss can be 'cancel', 'overlay',
// 'close', and 'timer'
    if (dismiss === 'overlay') {
        swal(
            'Please Contemplate Your Life',
            'Don\'t make me have to toggle this modal again! I\'d rather not!',
            'info'
        );
    }
}).catch(swal.noop);

В конце концов, я начал с одной цели: улучшить пользовательский опыт. Обещания здесь работают, потому что в противном случае модальное окно закрывалось бы после каждого нажатия кнопки, и пользователю пришлось бы заново запускать всю цепочку, если бы он сделал что-то настолько простое, как не включать @ с вводом электронной почты или что-то в этом роде.

Обещания позволяют нам держать модальное окно SWAL2 на экране до тех пор, пока не будет выполнено какое-то условие. условие может быть любым, в моем случае это была проверка формы в PHP, которая возвращала строки в javascript. Если входные данные были в порядке, строка равна «1». В противном случае строка содержит что-то вроде «0», «Неверный номер телефона», «Учетная запись уже связана с этим адресом электронной почты», «и т. д.». Затем JQuery создает массив, удаляет начальные нули и выводит всплывающие уведомления для каждой ошибки в массиве.

Я надеюсь, что это поможет вам в использовании SWAL2.

person Willie    schedule 17.01.2018