#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
вызовом другой службы.