JQuery правильный способ массовых запросов AJAX - PullRequest
0 голосов
/ 31 октября 2009

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

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

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

1 Ответ

9 голосов
/ 31 октября 2009

С каждым 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 Top Ten . Он охватывает наиболее распространенные (но не все ) основные эксплойты на веб-сайтах и ​​объясняет, как не стать их жертвой.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...