Я разработал хороший многофункциональный интерфейс приложения, используя Backbone.js , где пользователи могут очень быстро добавлять объекты, а затем начать обновлять свойства этих объектов, просто вкладывая их в соответствующие поля. Проблема, с которой я сталкиваюсь, заключается в том, что иногда пользователь бьет по серверу до первоначального сохранения, и в итоге мы сохраняем два объекта.
Пример того, как воссоздать эту проблему, выглядит следующим образом:
Пользователь нажимает кнопку «Добавить человека», мы добавляем ее в DOM, но пока ничего не сохраняем, поскольку у нас еще нет данных.
person = new Person();
Пользователь вводит значение в поле Имя и выделяет его (поле имени теряет фокус). Это инициирует сохранение, чтобы мы обновили модель на сервере. Поскольку модель новая, Backbone.js автоматически отправит POST (создать) запрос на сервер.
person.set ({ name: 'John' });
person.save(); // create new model
Затем пользователь очень быстро вводит в поле возраста, в которое он вкладывал, вводит 20 и вкладки в следующее поле (поэтому возраст теряет фокус). Это снова вызывает сохранение, чтобы мы обновили модель на сервере.
person.set ({ age: 20 });
person.save(); // update the model
Таким образом, в этом сценарии мы ожидаем один запрос POST для создания модели и один запрос PUT для обновления модели.
Однако, если первый запрос все еще обрабатывается, и у нас не было ответа до выполнения кода в пункте 3 выше, то мы фактически получаем два запроса POST и, следовательно, два объекта, созданных вместо одного.
Итак, мой вопрос: есть ли какой-нибудь наилучший способ решения этой проблемы и Backbone.js? Или, должен ли Backbone.js иметь систему очередей для действий сохранения, чтобы один запрос не отправлялся до тех пор, пока предыдущий запрос для этого объекта не будет выполнен успешно или не выполнен? Или, в качестве альтернативы, я должен построить что-то для изящной обработки, отправив только один запрос на создание вместо нескольких запросов на обновление, возможно, использовать какое-либо регулирование или проверить, находится ли модель Backbone в середине запроса, и подождать, пока этот запрос не будет выполнен. завершено.
Буду признателен за советы по решению этой проблемы.
И я рад попытаться реализовать какую-то систему очередей, хотя вам, возможно, придется смириться с моим кодом, который просто не будет так хорошо сформирован, как существующая база кода!