Сохранение и закрытие выхода из веб-ресурса перед асинхронным вызовом веб-API
Я создаю довольно сложный веб-ресурс, который использует Dynamics Web API для чтения / записи данных в Dynamics. У меня есть ситуация, когда мне нужно создать сущность, которая требует ID от двух других сущностей, которые мне нужно создать. Для этого я использую два асинхронных вызова, чтобы создать две сущности, а затем я использую данные, возвращенные из двух асинхронных вызовов, чтобы заполнить записи данных в моей третьей сущности, которую я создаю. Проблема, с которой я столкнулся, заключается в том, что когда кто-то нажимает кнопку "Сохранить и закрыть", закрытие происходит до того, как завершатся мои асинхронные вызовы. Первый вызов создания отправляется, а затем происходит закрытие без второго или третьего создания. Я также опасаюсь, что при сохранении у меня, скорее всего, возникнет состояние гонки с вызовами Web API, при котором, если кто-то нажмет кнопку Закрыть достаточно быстро после сохранения, все данные могут быть не сохранены. Есть ли способ обойти эту проблему с асинхронными вызовами?
Некоторые возможные решения, которые я исследовал, которые либо не работают, либо мне не очень нравятся
- Отключите Save & Close (возможно, сохраняются условия гонки при выполнении Save, а затем Close)
- Пакетная обработка (не уверен, что это сработает, но гораздо сложнее, если это сработает)
- Используйте тайм-ауты, чтобы сделать паузу близко (не думаю, что это сработает)
- Отмена Закрыть и переиздать Закрыть после завершения сохранения (должен быть лучший способ, верно?)
2 ответа
Здесь есть два решения, которые, кажется, работают.
- Удалить кнопку Сохранить и закрыть.
- Добавить пользовательскую кнопку для сохранения и закрытия.
Мы закончили с использованием варианта 1, но в какой-то момент можем обвести назад, чтобы попробовать вариант 2. Мы также добавили всплывающее окно, чтобы показать сообщение об успехе / неудаче, когда сохранение завершено, чтобы пользователь привык ждать всплывающее окно. до навигации от страницы.
По сути, я не хочу останавливать пользователя для моих внутренних операций, это будет плохой пользовательский опыт. Тем не менее, если Business соглашается, вы можете иметь пользовательскую кнопку Сохранить и закрыть или запретить использование OOB по умолчанию Сохранить и закрыть, открыть пользовательский веб-ресурс HTML, показывающий индикатор выполнения, выполняя все вызовы Async WebAPI внутри всплывающего окна, пока мы не получим статус 200 для всех, затем закройте всплывающее окно прогресса.
Другой путь - Classic Async Plugin для достижения этой цели. Даже Действие доступно. В отличие от службы Organizationdata, конечная точка WebAPI также может помочь в коде на стороне сервера.