jquery правильный способ групповой обработки ajax-запросов

StackOverflow https://stackoverflow.com/questions/1653127

  •  22-07-2019
  •  | 
  •  

Вопрос

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

очевидно, если я просто выполняю простой цикл и каждый раз вызываю функцию ajax, но как я могу зациклить и проверить, какой из них прошел успешно, а какой не удалось, и когда они все будут выполнены?

как бы ты это сделал?каков правильный способ массового редактирования/удаления?

Это было полезно?

Решение

Каждый ajax-запрос будет иметь связанные с ним накладные расходы.Было бы плохой идеей выполнять вызов для каждой строки, поскольку это может перегрузить сервер запросами, и вы можете DoS самому если вы получаете достаточно трафика.Кроме того, все браузеры имеют ограничение на количество HTTP-запросов, которые можно выполнить одновременно, поэтому (в зависимости от браузера) удаления будут происходить пакетами, а не все сразу, даже если вы прикажете им выполняться один за другим.

Лучшим вариантом было бы сгруппировать строки для редактирования/удаления в массив JSON и отправить их на сервер одним запросом.Затем на сервере вы можете проанализировать JSON и соответственно удалить элементы.Закончив, верните массив JSON, содержащий ваши результаты.

Этот псевдокод jQuery предполагает, что вы ориентируетесь либо на браузеры с собственным JSON-объект, или вы используете json2.js.По сути, этот код просто ищет поле «скрытый идентификатор» в каждой строке таблицы, которую вы отображаете пользователю, и добавляет его в массив.Вы можете настроить это по своему усмотрению.

var recordsToDelete = [];
$("tr.myRow").each(function() {
    var id = $(this).find("input:hidden").val();
    recordsToDelete.push(id);
});
var json = JSON.stringify(recordsToDelete);

Работать с результатами может быть сложнее.Вы должны спроектировать свою систему так, чтобы (в случае успеха) удалялась каждая строка.Если вы не имеете дело с очень сложной системой, у вас никогда не должна возникнуть ситуация, когда некоторые строки проходят успешно, а некоторые — нет.Если это произойдет, вам необходимо пересмотреть архитектуру вашей системы.jQuery имеет мероприятия для success и failure который вы можете использовать, чтобы справиться с общим успехом или неудачей запроса, который я рекомендую вам использовать.

Продолжая приведенный выше код, это один из способов удаления записей.Я использую complete здесь для простоты, но вам следует использовать success и failure мероприятия, если это возможно.А complete событие происходит всегда, независимо от того, успешен ли запрос или нет.

$.ajax({
    url: "http://stackoverflow.com/questions/1653127",        
    type: "POST", // Always use POST when deleting data
    data: { ids: json },
    complete: function(xhr, status) {
        var response = JSON.parse(xhr.responseXML);
        // Response will be an array of key/value
        // pairs indicating which rows succeeded or failed
        for (var i = 0; i < response.length; i++) {
            var recordID = response[i].recordID;
            var status = response[i].status;
            // Do stuff with the status codes here
        }
    }
});

В ответ на комментарии:

  • Для таких приложений, как Gmail, принцип работы настолько сложен, что говорить: «Я сделаю так, потому что Google делает так» — не лучшая идея.Не все, что работает для Google, подойдет для каждой компании или веб-сайта.У таких компаний, как Google, есть проблемы, о которых почти ни одному другому веб-сайту не стоит беспокоиться.Однако, чтобы ответить на ваш вопрос
    • Я только что проверил это, чтобы быть уверенным:GMail использует один запрос AJAX с массивом идентификаторов.Никакие отдельные коды состояния не отправляются обратно.Похоже (и я здесь предполагаю), что Gmail возвращает «идентификатор действия» для действия, которое вы только что выполнили, поэтому вы можете отменить это действие, щелкнув ссылку отмены, которая ненадолго появляется после удаления электронного письма.
    • При работе над приложением обычно хочется сделать его достаточно надежным, чтобы операции не прерывались.Чтобы убедиться в этом, вам следует провести строгий контроль качества.По сути, операция удаления должна либо пройти, либо завершиться неудачей в целом.Это может произойти, если пользователь нажмет кнопку «Удалить», когда ваш сервер выйдет из строя.Для пользователя сайт все еще работает, потому что вы не перезагружаете страницу, но запрос AJAX завершится неудачей, потому что ему некуда идти.Вам захочется справиться с такими вещами.
    • Это действительно зависит от бизнес-правил вашего приложения.Если ваше приложение используется в ситуации, когда несколько человек могут одновременно изменять записи (просто пример), то что-то, что пытается удалить один пользователь, могло быть удалено кем-то другим непосредственно перед тем, как он нажмет кнопку «Удалить».В большинстве случаев я не вижу людей, которые заботятся о том, кто первым удалил запись, поскольку если она удалена, она удалена, независимо от того, кто на самом деле это сделал.Однако бизнес-правило может диктовать (как бы смешно это ни было), что вам необходимо сообщать эту информацию пользователю.В этом случае вам придется возвращать массив статусов для каждого удаления.
  • Чтобы не дать хакерам удалить записи других людей, нужно сделать несколько вещей:
    • Относитесь к своим обработчикам AJAX так же, как и к остальной части сайта.Они не должны получать никаких особых привилегий.Запрос к обработчику AJAX должен пройти аутентификацию так же, как и все остальное.
    • Используйте POST-запросы (как я упоминаю в своем примере) для разрушительных операций или для операций, изменяющих данные.Это усложнит работу хакерам. Подделка межсайтовых запросов (CSRF).Конечно, это не надежная мера, но она предотвращает простые эксплойты.
    • Очевидно, не предполагайте, что пользователь имеет право удалить запись только потому, что он отправил запрос на удаление.Убедитесь, что пользователь, выполняющий удаление, имеет право удалить каждую запись.То, как вы это сделаете, будет зависеть от вашего серверного приложения.
    • Убедитесь, что вы закодировали все отправленные значения. от клиент на сервер.Это предотвратит SQL-инъекции.
    • Убедитесь, что вы знакомы с Список десяти лучших OWASP.Он охватывает наиболее распространенные (но не все) основные эксплойты на веб-сайтах и ​​объясняет, как не стать их жертвой.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top