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