-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit 391e686
Showing
13 changed files
with
645 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
build/ | ||
.vscode/ | ||
oscript_modules/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
The MIT License (MIT) | ||
===================== | ||
|
||
Copyright © `2023` `Kirill Chernenko <[email protected]>` | ||
|
||
Permission is hereby granted, free of charge, to any person | ||
obtaining a copy of this software and associated documentation | ||
files (the “Software”), to deal in the Software without | ||
restriction, including without limitation the rights to use, | ||
copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
copies of the Software, and to permit persons to whom the | ||
Software is furnished to do so, subject to the following | ||
conditions: | ||
|
||
The above copyright notice and this permission notice shall be | ||
included in all copies or substantial portions of the Software. | ||
|
||
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, | ||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES | ||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT | ||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, | ||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
OTHER DEALINGS IN THE SOFTWARE. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,91 @@ | ||
# async | ||
|
||
Асинх библиотека для реализации асинхронного взаимодействия для OneScript | ||
|
||
## Программный интерфейс | ||
|
||
### Модуль Асинхронность | ||
|
||
#### ВыполнитьЛямбду | ||
|
||
```bsl | ||
// Выполняет асинхронно переданную лямбду | ||
// | ||
// Параметры: | ||
// Алгоритм - Строка - Лямбда выражение которое требуется исполнить | ||
// Объект - Сценарий - Объект который необходимо захватить в лямбду | ||
// Параметры - Массив из Произвольный - Параметры алгоритма | ||
// | ||
// Возвращаемое значение: | ||
// Обещание - Обещание о выполнении переданного алгоритма | ||
// | ||
Функция ВыполнитьЛямбду(Знач Алгоритм, Объект, Параметры) | ||
``` | ||
|
||
#### ВыполнитьДелегат | ||
|
||
```bsl | ||
// Выполняет асинхронно переданный делегат | ||
// | ||
// Параметры: | ||
// Действие - Действие - Делегат на метод который требуется исполнить | ||
// Параметры - Массив из Произвольный - Параметры метода | ||
// | ||
// Возвращаемое значение: | ||
// Обещание - Обещание о выполнении переданного метода | ||
// | ||
Функция ВыполнитьДелегат(Действие, Параметры) | ||
``` | ||
|
||
### Класс Обещание | ||
|
||
#### Получить | ||
|
||
```bsl | ||
// Получает результат исполнения обещания | ||
// | ||
// Параметры: | ||
// Таймаут - Число - Время в миллисекундах в течении которого нужно ожидать завершения задания, | ||
// если время ожидания будет превышено, будет выброшено исключение | ||
// | ||
// Возвращаемое значение: | ||
// Произвольный - Результат исполнения обещания | ||
// | ||
Функция Получить(Таймаут = 0) | ||
``` | ||
|
||
#### Затем | ||
|
||
```bsl | ||
// После получения результата запускает ещё одно задание которое будет асинхронно | ||
// выполнять переданный алгоритм над результатом | ||
// | ||
// Параметры: | ||
// Алгоритм - Строка - Лямбда выражение функция с одним параметром, которая принимает результат исполнения | ||
// текущего обещания и возвращает новый результат | ||
// - Действие - Делегат на функцию с одним параметром, которая принимает результат исполнения | ||
// текущего обещания и возвращает новый результат | ||
// | ||
// Возвращаемое значение: | ||
// Обещание - Обещание об исполнение алгоритма над результатом исполнения текущего обещания | ||
// | ||
Функция Затем(Знач Алгоритм) | ||
``` | ||
|
||
#### Поймать | ||
|
||
```bsl | ||
// В случае если в нижестоящих обещаниях будет выброшено исключение, оно будет перехвачено | ||
// и передано в указанный алгоритм. | ||
// | ||
// Параметры: | ||
// Алгоритм - Строка - Лямбда выражение функция с одним параметром, которая принимает ИнформацияОбОшибке | ||
// нижестоящих обещаний и возвращает новый результат | ||
// - Действие - Делегат на функцию с одним параметром, которая принимает ИнформацияОбОшибке | ||
// нижестоящих обещаний и возвращает новый результат | ||
// | ||
// Возвращаемое значение: | ||
// Обещание - Обещание о выполнении алгоритма в случае возникновения исключения | ||
// | ||
Функция Поймать(Алгоритм) | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
Описание.Имя("async") | ||
.Версия("0.1.0") | ||
.Автор("Кирилл Черненко") | ||
.АдресАвтора("https://github.com/sfaqer") | ||
.Описание("Фреймворк асинхронного исполнения для OneScript") | ||
.ВерсияСреды("1.8.4") | ||
.ВключитьФайл("src") | ||
.ВключитьФайл("README.md") | ||
.ВключитьФайл("LICENSE.md") | ||
.РазработкаЗависитОт("1testrunner") | ||
.РазработкаЗависитОт("coverage") | ||
.РазработкаЗависитОт("fs") | ||
.РазработкаЗависитОт("json") | ||
.РазработкаЗависитОт("asserts") | ||
.ЗависитОт("lambdas", "0.1.3") | ||
; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
#Область ОписаниеПеременных | ||
|
||
Перем Алгоритм; // Алгоритм выполняемый асинхронно | ||
Перем Параметры; // Параметры алгоритма | ||
Перем Предыдущий; // Предыдущее обещание результат которого передаётся как параметр в алгоритм | ||
Перем ПерехватчикИсключения; // Это обещание перехватчик исключения | ||
|
||
#КонецОбласти | ||
|
||
#Область СлужебныеПроцедурыИФункции | ||
|
||
Процедура ПриСозданииОбъекта(пАлгоритм, пПараметры, пПерехватчикИсключения) | ||
|
||
Если ТипЗнч(пПараметры) = Тип("Обещание") Тогда | ||
Предыдущий = пПараметры; | ||
Иначе | ||
Параметры = пПараметры; | ||
КонецЕсли; | ||
|
||
Алгоритм = пАлгоритм; | ||
ПерехватчикИсключения = пПерехватчикИсключения; | ||
|
||
КонецПроцедуры | ||
|
||
#КонецОбласти | ||
|
||
#Область СлужебныйПрограммныйИнтерфейс | ||
|
||
Функция Алгоритм() Экспорт | ||
Возврат Алгоритм; | ||
КонецФункции | ||
|
||
Функция Параметры() Экспорт | ||
Возврат Параметры; | ||
КонецФункции | ||
|
||
Функция Предыдущий() Экспорт | ||
Возврат Предыдущий; | ||
КонецФункции | ||
|
||
Функция ПерехватчикИсключения() Экспорт | ||
Возврат ПерехватчикИсключения; | ||
КонецФункции | ||
|
||
#КонецОбласти |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,111 @@ | ||
#Использовать lambdas | ||
|
||
#Область ОписаниеПеременных | ||
|
||
Перем Задание; // Задание которое исполняет обещание | ||
|
||
// Контекст исполнения обещания | ||
Перем КонтекстВыполнения; // BSLLS:UnusedLocalVariable-off Доступ через рефлектор в служебном интерфейсе | ||
|
||
#КонецОбласти | ||
|
||
#Область ПрограммныйИнтерфейс | ||
|
||
// Получает результат исполнения обещания | ||
// | ||
// Параметры: | ||
// Таймаут - Число - Время в миллисекундах в течении которого нужно ожидать завершения задания, | ||
// если время ожидания будет превышено, будет выброшено исключение | ||
// | ||
// Возвращаемое значение: | ||
// Произвольный - Результат исполнения обещания | ||
// | ||
Функция Получить(Таймаут = 0) Экспорт | ||
|
||
Дождались = Задание.ОжидатьЗавершения(Таймаут); | ||
|
||
Если Дождались И Задание.Состояние = СостояниеФоновогоЗадания.Завершено Тогда | ||
Возврат Задание.Результат; | ||
ИначеЕсли Не Дождались Тогда | ||
ВызватьИсключение "Превышено время ожидания получения результата"; | ||
Иначе | ||
ВызватьИсключение ПодробноеПредставлениеОшибки(Задание.ИнформацияОбОшибке); | ||
КонецЕсли; | ||
|
||
КонецФункции | ||
|
||
// После получения результата запускает ещё одно задание которое будет асинхронно | ||
// выполнять переданный алгоритм над результатом | ||
// | ||
// Параметры: | ||
// Алгоритм - Строка - Лямбда выражение функция с одним параметром, которая принимает результат исполнения | ||
// текущего обещания и возвращает новый результат | ||
// - Действие - Делегат на функцию с одним параметром, которая принимает результат исполнения | ||
// текущего обещания и возвращает новый результат | ||
// | ||
// Возвращаемое значение: | ||
// Обещание - Обещание об исполнение алгоритма над результатом исполнения текущего обещания | ||
// | ||
Функция Затем(Знач Алгоритм) Экспорт | ||
|
||
Если ТипЗнч(Алгоритм) = Тип("Строка") Тогда | ||
|
||
Алгоритм = Лямбда.Выражение(Алгоритм) | ||
.Интерфейс(ФункциональныеИнтерфейсы.УниФункция()) | ||
.ВДействие(); | ||
|
||
КонецЕсли; | ||
|
||
Результат = Новый Обещание(Алгоритм, ЭтотОбъект); | ||
|
||
АсинхронностьСлужебный.ЗапуститьВыполнениеОбещания(Результат); | ||
|
||
Возврат Результат; | ||
|
||
КонецФункции | ||
|
||
// В случае если в нижестоящих обещаниях будет выброшено исключение, оно будет перехвачено | ||
// и передано в указанный алгоритм. | ||
// | ||
// Параметры: | ||
// Алгоритм - Строка - Лямбда выражение функция с одним параметром, которая принимает ИнформацияОбОшибке | ||
// нижестоящих обещаний и возвращает новый результат | ||
// - Действие - Делегат на функцию с одним параметром, которая принимает ИнформацияОбОшибке | ||
// нижестоящих обещаний и возвращает новый результат | ||
// | ||
// Возвращаемое значение: | ||
// Обещание - Обещание о выполнении алгоритма в случае возникновения исключения | ||
// | ||
Функция Поймать(Алгоритм) Экспорт | ||
|
||
Если ТипЗнч(Алгоритм) = Тип("Строка") Тогда | ||
|
||
Алгоритм = Лямбда.Выражение(Алгоритм) | ||
.Интерфейс(ФункциональныеИнтерфейсы.УниФункция()) | ||
.ВДействие(); | ||
|
||
КонецЕсли; | ||
|
||
Результат = Новый Обещание(Алгоритм, ЭтотОбъект, Истина); | ||
|
||
АсинхронностьСлужебный.ЗапуститьВыполнениеОбещания(Результат); | ||
|
||
Возврат Результат; | ||
|
||
КонецФункции | ||
|
||
#КонецОбласти | ||
|
||
#Область СлужебныеПроцедурыИФункции | ||
|
||
Процедура ПриСозданииОбъекта(Алгоритм, Параметры, ПерехватчикИсключения = Ложь) | ||
|
||
КонтекстВыполнения = Новый КонтекстВыполненияОбещания( | ||
Алгоритм, | ||
Параметры, | ||
ПерехватчикИсключения | ||
); | ||
|
||
КонецПроцедуры | ||
|
||
#КонецОбласти |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
#Область ОписаниеПеременных | ||
|
||
Перем Рефлектор; // Для доступа к приватным полям обещания | ||
|
||
#КонецОбласти | ||
|
||
#Область СлужебныйПрограммныйИнтерфейс | ||
|
||
Процедура ЗапуститьВыполнениеОбещания(Обещание) Экспорт | ||
|
||
Параметры = Новый Массив; | ||
Параметры.Добавить(Обещание); | ||
|
||
Задание = ФоновыеЗадания.Выполнить(ЭтотОбъект, "ВыполнитьОбещание", Параметры); | ||
|
||
Рефлектор.УстановитьСвойство(Обещание, "Задание", Задание); | ||
|
||
КонецПроцедуры | ||
|
||
Функция ВыполнитьОбещание(Обещание) Экспорт | ||
|
||
Контекст = Рефлектор.ПолучитьСвойство( | ||
Обещание, | ||
"КонтекстВыполнения" | ||
); | ||
|
||
Если Контекст.Предыдущий() <> Неопределено Тогда | ||
|
||
Если Контекст.ПерехватчикИсключения() Тогда | ||
|
||
Попытка | ||
Результат = Контекст.Предыдущий() | ||
.Получить(); | ||
Исключение | ||
Результат = Контекст.Алгоритм() | ||
.Выполнить(ИнформацияОбОшибке()); | ||
КонецПопытки; | ||
|
||
Возврат Результат; | ||
|
||
Иначе | ||
|
||
Возврат Контекст.Алгоритм() | ||
.Выполнить(Контекст.Предыдущий().Получить()); | ||
|
||
КонецЕсли; | ||
|
||
Иначе | ||
|
||
Параметры = Контекст.Параметры(); | ||
|
||
СтрокаПараметров = Новый Массив(); | ||
|
||
Для Счетчик = 0 По Параметры.ВГраница() Цикл | ||
СтрокаПараметров.Добавить(СтрШаблон("Параметры[%1]", Счетчик)); | ||
КонецЦикла; | ||
|
||
Возврат Вычислить(СтрШаблон("Контекст.Алгоритм().Выполнить(%1)", СтрСоединить(СтрокаПараметров, ","))); | ||
|
||
КонецЕсли; | ||
|
||
КонецФункции | ||
|
||
#КонецОбласти | ||
|
||
Рефлектор = Новый Рефлектор(); |
Oops, something went wrong.