Имя: Пароль:
1C
 
Асинх / Ждать
0 ДНН
 
14.12.20
22:41
Платформа 8.3.18

Код:
&НаКлиенте
Асинх Процедура Команда1(Команда)
    Обещание = ОткрытьДиалог();
    Для ё = 1 По 10 Цикл
        Сообщить(ё);
    КонецЦикла;    
    Каталог = Ждать Обещание;
    Сообщить(Каталог);
КонецПроцедуры

&НаКлиенте
Асинх Функция ОткрытьДиалог()
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    Обещание = Диалог.ВыбратьАсинх();
    МассивКаталогов = Ждать Обещание;
    Возврат МассивКаталогов[0];
КонецФункции

Открывается диалог выбора файла и я секунд 5 ничего не выбираю.
Насколько я понял сначала должны вывестить цифры от 1 до 10 (так как я еще не выбрал файл), а потом выбранный файл. Однако сначала выводится выбранный файл, а только потом цифры. Почему так?
1 ДНН
 
14.12.20
22:52
При этом в отладке я сначала попадаю в цикл, а только потом открывается диалог выбора. Но сообщение из диалога все равно впереди
2 ДНН
 
14.12.20
22:59
И даже если сделать так:

&НаКлиенте
Асинх Процедура Команда1(Команда)
    Сообщить("Самое первое");
    Обещание = ОткрытьДиалог();
    Для ё = 1 По 10 Цикл
        Сообщить(ё);
    КонецЦикла;    
    Каталог = Ждать Обещание;
    Сообщить(Каталог);
КонецПроцедуры

&НаКлиенте
Асинх Функция ОткрытьДиалог()
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    Обещание = Диалог.ВыбратьАсинх();
    МассивКаталогов = Ждать Обещание;
    Возврат МассивКаталогов[0];
КонецФункции

Все равно сначала выбранный файл, а потом Самое первое
3 Cthulhu
 
14.12.20
23:15
так вроде и описывалось
инициализация обещания >>> переход к евонному "ждать", как только оно дождалось - продолжение выполнения сразу после инициализации обещания и далее...
4 ДНН
 
14.12.20
23:22
(3) 1. Дошли до строчки Обещание = Диалог.ВыбратьАсинх(); открывается диалог. Так как это асинхронный метод выполнение кода продолжается дальше
2. доходим до строчки МассивКаталогов = Ждать Обещание; начинается ожидание, но выполнение код продолжается, так как это асинхронная функция
3. возвращаемся в процедуру Команда1, цикл должен вывести цифры от 1 до 10
4. Каталог = Ждать Обещание; - ждем результат асинхронной функции ОткрытьДиалог()
5. Выбрали файл, управление переходит в точку МассивКаталогов = Ждать Обещание; получаем из массива первый выбранный файл, возвращаем его.
6. в Обещании из Процедуры Команда1 появляется результат обещания, следовательно управление переходит в строку Каталог = Ждать Обещание;, сообщаем имя каталога

Насколько я понял должно быть так
5 Cthulhu
 
15.12.20
01:21
(4): нет, начиная с п.2 - нет. никуда ничего не продолжается пока не завершится ожидание.
6 ДНН
 
15.12.20
01:26
(5) Не продолжается то что ниже, но выполняется цикл из первой процедуры. Это даже по отладке видно
7 Cthulhu
 
15.12.20
02:44
извини, по кругу бегать надоело. все что зналось - тебе сказалось, удачи.
8 Провинциальный 1сник
 
15.12.20
04:52
Нихрена не понятно с этими Асинхами и Обещаниями.. мозговыворот какой-то
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший