несколько destroy () s блокируют бэкэнд в backbone.js - PullRequest
1 голос
/ 02 марта 2011

В примере приложения Todos для backbone.js это происходит:

clearCompleted: function() {
  _.each(Todos.done(), function(todo){ todo.clear(); });
  return false;
},

Это удаляет несколько моделей, отправляя несколько запросов http DELETE любой службе, поддерживающей приложение.,В этом примере это не проблема, потому что они используют решение локального хранилища.

Но когда я пытаюсь подобный процесс с базой данных на сервере (sqlite / datamapper / sinatra) факт, что он отправляетОтключение нескольких запросов http на удаление одновременно приводит к тому, что БД блокируется и отправляет обратно ошибку.

Это кто-то из вас сталкивался?

Я могу придумать два пути:

  1. Имеет destroyBatch (), который отправляет массив идентификаторов в вызов DELETE, а sinatra вынюхивает множественные идентификаторы и обрабатывает все удаления сразу на стороне сервера.

  2. Иметь destroyAsync () на стороне клиента, который помещает идентификаторы в очередь и вызывает destroy () для моделей по одному в асинхронной цепной реакции, пока они не будутвсе исчезло (но вы бы увидели, что они удаляются по одному на экране с паузой между ними). ​​

Возможно, какое-либо из этих решений кажется разумным, или я хрупкий гусьдико хлопает?

-j

1 Ответ

1 голос
/ 03 марта 2011

Вариант 2 не является жизнеспособным.Ваш пользователь может щелкнуть назад или закрыть окно, и удаление не удастся полностью.Так что с этим.

Это оставляет нам:

  • Исправить вашу первоначальную проблему блокировок в БД: D
  • Отправить все идентификаторы для удаления наодин раз.

Я бы сначала попытался решить начальную проблему.Что заставляет их запирать?Я почти уверен, что в режиме разработки sinatra будет обрабатывать один запрос за раз, поэтому отправка пакета удаления будет сериализована при обработке бэкэнда ... Это еще один вопрос, связанный с возвращенной ошибкой sqlite.

Что касается отправки удаления партиями.Это хорошая идея, но она отличается от стандартного контроллера RESTful.Таким образом, вам придется справиться с этим самостоятельно, так как магистраль не предоставляет способ сделать это.Вы можете добавить метод deleteAll в коллекцию и обработать синхронизацию оттуда (не забывайте отправлять события, если вы полагаетесь на них).

...