autumn-async

Модуль ОСени для внедрения асинхронного API для вашей библиотеки

Использование

Допустим у вас есть API в вашем Желуде которое хочется выполнять в отдельном потоке:

// МойЖелудь.os

Функция СкачатьЧтоНибудьИзИнтернета(ЧтоСкачать) Экспорт

    // Качаем большой файл
    Приостановить(5000);

    Возврат Результат;

КонецФункции

В таком виде пользователю прийдётся ждать пока качается очень большой файл, а он мог бы заняться в это время чем нибудь полезным, чтобы облегчить ему жизнь теперь можно просто навесить аннотацию &Асинх на метод который нужно выполнить асинхронно и пользователь получит Обещание на то что файл будет скачан и сможет его получить когда заняться будет больше нечем.

Особенности работы с процедурами

В свете того что процедуры ничего не возвращают, то пользователь не получит обещание о исполнении метода, он просто будет фоном выполнен, останется только подождать.
Основная сложность при возникновении Исключений при фоновом исполнении процедур, по умолчанию библиотека представляет стандартный перехватчик который залогирует возникшую ошибку и имя метода в котором она возникла.
При необходимости более сложной логики обработки исключений, вы можете создать Желудь в котором будет реализован определённый API


// МойКлассныйПерехватчик.os

Процедура ОбработатьИсключение(
        ИнформацияОбОшибке, // Информация о возникшем исключении
        ИмяМетода,          // Имя метода в котором возникло исключение
        Параметры           // Параметры метода которые были в него переданы
    ) Экспорт

    // Полезный код обработки исключения

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

&Желудь
Процедура ПриСозданииОбъекта()
КонецПроцедуры

После чего указать этот Желудь как обработчик не перехваченных исключений в вашем асинхронном желуде:

// АсинхронныйЖелудь.os

&Желудь
&Асинх("МойКлассныйПерехватчик")
Процедура ПриСозданииОбъекта()
КонецПроцедуры

Так же вы можете глобально переопределить стандартный обработчик не перехваченных исключений добавив &Верховный &Желудь("СтандартныйОбработчикНеПерехваченныхАсинхронныхИсключений")

Важно:
В рамках этого обработчика нельзя использовать ВызватьИсключение, оно никак не будет обработано и никаких следов о исключении не останется.