IMO, вариант 1) усложняет использование API, потому что будет два разных пути для сообщения об ошибках:
Теперь программист должен убедиться, что оба эти пути правильно обработаны, а не один.
Интересно также отметить, что поведение как для C #, так и для Javascript заключается в том, чтобы всегда сообщать об исключениях, выбрасываемых внутри тела функции async
через возвращаемые Task
/ Promise
, даже для исключений, выданных перед первым await
, и никогда не заканчивая вызов функции async
исключением.
То же самое верно и для сопрограмм Котлина, даже при использовании диспетчера Unconfined
class SynchronousExceptionExamples {
@Test
fun example() {
log.info("before launch")
val job = GlobalScope.launch(Dispatchers.Unconfined) {
log.info("before throw")
throw Exception("an-error")
}
log.info("after launch")
Thread.sleep(1000)
assertTrue(job.isCancelled)
}
}
будет получено примечание
6 [main] INFO SynchronousExceptionExamples - before launch
73 [main @coroutine#1] INFO SynchronousExceptionExamples - before throw
(...)
90 [main] INFO SynchronousExceptionExamples - after launch
, поскольку исключение происходит в main
нить, однако launch
заканчивается правильным Job
.
Существует много способов обработать эту ситуацию. Тот путем блокировки формы и разрешения только одного редактирования за один раз. Другой должен обнаружить коллизии при сохранении и предупредить пользователя.
Блокировка является самой полезной на ресурсах с высокой конкуренцией. Если много коллизий ожидаются, затем заставляя пользователя нажать работы кнопки редактирования лучше всего. Это должно отметить запись, как привязано Ваше хранилище данных и должно только позволить одному пользователю редактировать его. Запись должна быть разблокирована, когда пользователь сохраняет запись, или когда пользователь отменяет. В разъединенной ситуации как на веб-странице должно также быть автоматическое, разблокировали после промежутка времени.
Обнаружение коллизий сделано путем записи числа пересмотра или в последний раз отредактированной даты и времени и передачи этого клиенту, когда они просматривают страницу. Клиент затем пасует назад это к серверу, когда они совершают нападки, сохраняют, и он проверяется по значению в базе данных. Если значение изменилось затем, кто-то еще отредактировал запись, и пользователя можно предупредить относительно этого. Эта система работает намного лучше на маленькие редактирования, и когда ресурс вряд ли будет отредактирован в другом месте (это usally имеет место, когда существует много маленьких записей по сравнению с числом активных пользователей).
Я нахожу обнаружение работ коллизий лучше, и менее печально для пользователя в веб-приложениях. При условии, что текст, который они вводят, достаточно мелок. Это вызвано тем, что блокировка ресурсов может держаться за них намного дольше, чем neccesary, который очень печален
Это - эффективное решение, немного тяжелое на видимом управлении наверху, но возможно самом подходящем решении в зависимости от Вашего ожидаемого рабочего процесса.
Другие подходы включают:
a. Позвольте любому редактировать и отправлять форму, но если кто-то еще также отправил изменения, промежуточные время, так как форма была первоначально открыта, ответьте ошибкой 'конфликта'. Для улучшения этого при необходимости покажите два различных набора изменений и позвольте пользователю выбирать, чтобы подать заявку, или попытаться объединить изменения.
b. Имейте работу формы как редактора мгновенного эффекта без кнопки Save. Сохраните все открытые представления о форме актуальным использованием XMLHttpConnection к серверу так, чтобы, когда один пользователь вносит изменение в любое поле, это был more-or-less-instantaneously, обновленный на чьей-либо еще копии формы.