Я разработал приятный богатый интерфейс приложения, используя Backbone.js, где пользователи могут быстро добавлять объекты, а затем начинают обновлять свойства этих объектов, просто перейдя в соответствующие поля. Проблема, с которой я сталкиваюсь, заключается в том, что иногда пользователь бьет сервер до его первоначального сохранения, и мы в конечном итоге сохраняем два объекта.
Пример воссоздания этой проблемы выглядит следующим образом:
-
Пользователь нажимает кнопку "Добавить человека", мы добавляем это в DOM, но ничего не сохраняем, поскольку у нас пока нет данных.
person = new Person();
-
Пользователь вводит значение в поле "Имя" и выходит из него (поле имени теряет фокус). Это вызывает сохранение, так что мы обновляем модель на сервере. Поскольку модель является новой, Backbone.js автоматически выдаст запрос POST (create) на сервер.
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 в середине запроса и ждать, пока этот запрос не будет завершено.
Ваш совет о том, как справиться с этой проблемой, будет оценен.
И я рад принять удар по внедрению какой-то системы очередей, хотя вам, возможно, придется мириться с моим кодом, который просто не будет так хорошо сформирован, как существующая база кода!