У меня есть эта функция для сохранения объектов в сервисе. В приложении angular.
save(object: Object): Observable<Book> {
return this.http.put(this.baseUrl, object);
}
Поскольку все мы знаем, что http-запрос является асинхронным и может занять больше времени, чем мы ожидали.
При таких обстоятельствах, если я вызываю эту функцию save(object: Object)
часто. Может случиться так, что последний запрос не будет выполнен, а следующий запрос уже отправлен. Это вызовет проблемы.
Объект, который я хочу сохранить, имеет некоторые уникальные ограничения, такие как name и optimisti c lock.
См. Некоторые случаи ниже: с obj1 и obj2
Случай 1: obj obj1 и obj2 имеют одинаковые имена, но разные идентификаторы;
obj1 {
id: 1;
name: 'name1';
optimisticLock: 0;
}
obj2 {
id: 2;
name: 'name1';
optimictic: 0;
}
В этом случае, если obj1 был отправлен по http, но еще не завершено, затем отправляется и obj2. Для obj2 серверная сторона проверит, дублировано ли имя. Хотя мы видим, что obj1 и obj2 имеют одно и то же имя, но поскольку этот obj1 еще не был сохранен, проверка имени obj2 пройдет. Поэтому проверка уникальности имени obj2 прошла, но сохранение все равно не удалось, и на стороне сервера возникнет исключение уникального ограничения.
Случай 2 Если obj1 и obj2 - это одни и те же данные, но с разными именами, например:
obj1 {
id: 0;
name: 'previousName';
optimisticLock: 0;
}
obj2 {
id: 0;
name: 'newName';
optimisticLock: 0;
}
Сначала отправьте obj1, а затем отправьте obj2 для сохранения , obj1 сохранено и возвращаемое значение на стороне сервера выглядит следующим образом
obj1 {
id: 0;
name: 'previousName';
optimisticLock: 1;
}
Это обновит его оптимизм c lock 0 -> 1; Но этот ответ еще не был возвращен клиенту, поэтому obj2 optimisticLock по-прежнему равен 0 и отправляется на сторону сервера. Очевидно, что запрос на сохранение obj2 не будет выполнен.
Мы ожидали сохранить последнее изменение, но мы сохранили только obj1. Так что это серьезная проблема.
У меня есть идея решить эти два случая. Если я использую очередь, чтобы поставить все запросы. Все запросы должны быть помещены в эту очередь, и эта очередь отправляет первый запрос, прежде чем получить ответ от первого запроса, никакой другой запрос не будет отправлен. После ответа на первый запрос обновите эту очередь в соответствии с ответом. Затем отправьте второй запрос.
Но я не знаю, как закодировать это решение, кто-нибудь знает, как это сделать? Или у вас есть лучшее решение для решения проблем в case1 и case2?