Каталог решений - Синхронный и асинхронный вызов в новых версиях платформы

Синхронный и асинхронный вызов в новых версиях платформы

Синхронный и асинхронный вызов в новых версиях платформы

В наличии

Начиная с платформы 8.3.18.1128 переработана технология работы с асинхронными вызовами.
В данной статье хочу описать новые асинхронные вызовы и сравнить их с предыдущими на примере функции — Вопрос на клиенте.

Категория:

Описание

 

1) Ранее синхронный вызов выглядел так:

&НаКлиенте
Процедура СинхронныйВызов(Команда)

	Ответы = Новый СписокЗначений;
	Ответы.Добавить("Ответ1");
	Ответы.Добавить("Ответ2");
	
	Ответ = Вопрос("Ваш ответ?", Ответы);
	ОбщегоНазначенияКлиент.СообщитьПользователю("Ждем ответа");
	
	Если Ответ = "Ответ2" Тогда
		ОбщегоНазначенияКлиент.СообщитьПользователю("Верно");
	Иначе
		ОбщегоНазначенияКлиент.СообщитьПользователю("Не верно");
	КонецЕсли;	
		
КонецПроцедуры

Данный вызов имеет ограничение на модальность — какой режим стоит в конфигурации по использованию модальности.

Выполнение данного кода выглядит так:

Функция — Вопрос будет ждать ответа от пользователя, а только после ответа будет выполняться весь последующей код.

 

2) Ранее Асинхсинхронный вызов выглядел так:

&НаКлиенте
Процедура АсинхронныйВызов(Команда)
	
	Ответы = Новый СписокЗначений;
	Ответы.Добавить("Ответ1");
	Ответы.Добавить("Ответ2");
	
	ОписаниеОповещения = Новый ОписаниеОповещения("АсинхронныйВызовЗавершение", ЭтотОбъект);
	ПоказатьВопрос(ОписаниеОповещения, "Ваш ответ?", Ответы);	
	ОбщегоНазначенияКлиент.СообщитьПользователю("Ждем ответа");
		
КонецПроцедуры

&НаКлиенте
Процедура АсинхронныйВызовЗавершение(Ответ, ДополнительныеПараметры) Экспорт

	Если Ответ = "Ответ2" Тогда
		ОбщегоНазначенияКлиент.СообщитьПользователю("Верно");
	Иначе
		ОбщегоНазначенияКлиент.СообщитьПользователю("Не верно");
	КонецЕсли;	

КонецПроцедуры

Выполнение данного кода выглядит так:

Весь код процедуры выполнится сразу, а код оповещения выполнится, только после ответа пользователя.

 

3) Новый Асинхронный вызов:

Функция — ВопросАсинх возвращает ответ нового типа — Обещание:

 

 

Код:

&НаКлиенте
Асинх Процедура АсинхВызов(Команда)

    Ответы = Новый СписокЗначений;
    Ответы.Добавить("Ответ1");
    Ответы.Добавить("Ответ2");
    
    ОтветАсинх = ВопросАсинх("Ваш ответ?", Ответы);
    ОбщегоНазначенияКлиент.СообщитьПользователю("Ждем ответа");
    
    Ответ = Ждать ОтветАсинх;
    Если Ответ = "Ответ2" Тогда
        ОбщегоНазначенияКлиент.СообщитьПользователю("Верно");
    Иначе
        ОбщегоНазначенияКлиент.СообщитьПользователю("Не верно");
    КонецЕсли;    
    
КонецПроцедуры

Сама процедура имеет признак — Асинх.

Выполнение данного кода выглядит так:

При таком варианте, мы олучаем асинхронный вариант с возвратом к ожидаем в точке — Ждать.

ВопросАсинх возвращает тип — Обещание.

 

4) Новый асинхронный(синхронный) вызов:

Добавим в пункт 3 команду — Ждать.

Код будет выглядеть следующем образом:

&НаКлиенте
Асинх Процедура СинхронныййВызовНовый(Команда)

	Ответы = Новый СписокЗначений;
	Ответы.Добавить("Ответ1");
	Ответы.Добавить("Ответ2");
	
	Ответ = Ждать ВопросАсинх("Ваш ответ?", Ответы);
	ОбщегоНазначенияКлиент.СообщитьПользователю("Ждем ответа");
	
	Если Ответ = "Ответ2" Тогда
		ОбщегоНазначенияКлиент.СообщитьПользователю("Верно");
	Иначе
		ОбщегоНазначенияКлиент.СообщитьПользователю("Не верно");
	КонецЕсли;	
	
КонецПроцедуры

При такой конструкции код отработает следующем образом:

Получаем синхронный вызов, который ждет ответа пользователя и дальше выполняет весь код.

 

Вывод для себя сделал такой:

Если нужен синхронный вызов вопроса, то можно использовать 1 вариант (но тут нужно учитывать режим — модальности) или 4-й вариант (новый), а чтобы выполнить асинхронный вызов вопроса нужно использовать 3-й вариант или 2-й вариант (менее предпочтительный).

 

Тестирования проводились на платформе 8.3.18.1208.

has been added to your cart:
Оформление заказа