Как получить несколько ответов из PHP-файла через AJAX?

#php #javascript #ajax #jquery

#php #javascript #ajax #jquery

Вопрос:

Мой PHP-файл выполняет 2 операции: 1. Отправляет данные из формы в таблицу БД, 2. Отправляет электронное письмо.

Что я хочу сделать, так это показывать сообщения о состоянии через ajax. Например, «Первая операция выполнена, пожалуйста, подождите вторую», а затем, когда вторая операция будет завершена, отобразите следующее сообщение «Вторая операция тоже выполнена». Теперь мой ajax выглядит вот так.

Как я могу это изменить?

 //add status data to form
        form.data('formstatus', 'submitting');

        if (validate()) {
            //send data to server for validation
            $.ajax({
                url: formUrl,
                type: formMethod,
                dataType: "json",
                data: formData,
                success: function (data) { 
                    $.notifyBar({
                        cls: data.status,
                        html: data.message
                    });
                    form.data('formstatus', 'idle');
                }
            });

        }
  

Ответ №1:

в блоке success вы можете выполнить другой вызов ajax. Это самое простое. Вы можете сделать это в .success(), .ajaxSucces(), .complete() или .then() функционируют следующим образом: $.ajax (…).success(…);

в идеале вы бы встроили код в функцию, например

 $.ajax({
    url: formUrl,
    type: formMethod,
    dataType: "json",
    data: formData,
    success: function (data) {
        notifyResponse(data); 
        form.data('formstatus', 'idle');
        sendMail();
    }
});

function sendMail() {
    $.get(mailUrl, function(data) {   // or $.post(...
        notifyResponse(data);
    });
}

function notifyResponse(data) {
    $.notifyBar({
        cls: data.status,
        html: data.message
    });
}
  

Комментарии:

1. как будет выглядеть sendMail (функция)?

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

Ответ №2:

Если вам нужно выполнить две операции с разным временем выполнения, просто отправьте два разных AJAX-запроса и получите от них ответы.

Разделите свой PHP-сервис на две части. Если вторая часть зависит от первой, вместо того, чтобы отправлять два запроса одновременно, отправьте второй запрос, когда вернется первый.

Другими словами, в вашем успешном обратном вызове вы собираетесь уведомить пользователя о том, что первая операция завершена, и вы переходите к вызову второй операции, чей успешный обратный вызов сообщит, что вторая операция завершена.

Комментарии:

1. есть ли способ сделать это с помощью одной-единственной функции ajax? Пожалуйста, приведите пример кода для вашего описания

2. да, но вы не можете дать частичную обратную связь о двух операциях, две операции будут одной. Пример кода? Как и в примере из roselan, sendMail() функция будет другим $.ajax вызовом другой службы.