Skip to content

Commit 391e686

Browse files
committed
Первая реализация библиотеки
0 parents  commit 391e686

13 files changed

+645
-0
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
build/
2+
.vscode/
3+
oscript_modules/

LICENCE.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
The MIT License (MIT)
2+
=====================
3+
4+
Copyright © `2023` `Kirill Chernenko <[email protected]>`
5+
6+
Permission is hereby granted, free of charge, to any person
7+
obtaining a copy of this software and associated documentation
8+
files (the “Software”), to deal in the Software without
9+
restriction, including without limitation the rights to use,
10+
copy, modify, merge, publish, distribute, sublicense, and/or sell
11+
copies of the Software, and to permit persons to whom the
12+
Software is furnished to do so, subject to the following
13+
conditions:
14+
15+
The above copyright notice and this permission notice shall be
16+
included in all copies or substantial portions of the Software.
17+
18+
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND,
19+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
20+
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
22+
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
23+
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24+
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
25+
OTHER DEALINGS IN THE SOFTWARE.

README.md

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
# async
2+
3+
Асинх библиотека для реализации асинхронного взаимодействия для OneScript
4+
5+
## Программный интерфейс
6+
7+
### Модуль Асинхронность
8+
9+
#### ВыполнитьЛямбду
10+
11+
```bsl
12+
// Выполняет асинхронно переданную лямбду
13+
//
14+
// Параметры:
15+
// Алгоритм - Строка - Лямбда выражение которое требуется исполнить
16+
// Объект - Сценарий - Объект который необходимо захватить в лямбду
17+
// Параметры - Массив из Произвольный - Параметры алгоритма
18+
//
19+
// Возвращаемое значение:
20+
// Обещание - Обещание о выполнении переданного алгоритма
21+
//
22+
Функция ВыполнитьЛямбду(Знач Алгоритм, Объект, Параметры)
23+
```
24+
25+
#### ВыполнитьДелегат
26+
27+
```bsl
28+
// Выполняет асинхронно переданный делегат
29+
//
30+
// Параметры:
31+
// Действие - Действие - Делегат на метод который требуется исполнить
32+
// Параметры - Массив из Произвольный - Параметры метода
33+
//
34+
// Возвращаемое значение:
35+
// Обещание - Обещание о выполнении переданного метода
36+
//
37+
Функция ВыполнитьДелегат(Действие, Параметры)
38+
```
39+
40+
### Класс Обещание
41+
42+
#### Получить
43+
44+
```bsl
45+
// Получает результат исполнения обещания
46+
//
47+
// Параметры:
48+
// Таймаут - Число - Время в миллисекундах в течении которого нужно ожидать завершения задания,
49+
// если время ожидания будет превышено, будет выброшено исключение
50+
//
51+
// Возвращаемое значение:
52+
// Произвольный - Результат исполнения обещания
53+
//
54+
Функция Получить(Таймаут = 0)
55+
```
56+
57+
#### Затем
58+
59+
```bsl
60+
// После получения результата запускает ещё одно задание которое будет асинхронно
61+
// выполнять переданный алгоритм над результатом
62+
//
63+
// Параметры:
64+
// Алгоритм - Строка - Лямбда выражение функция с одним параметром, которая принимает результат исполнения
65+
// текущего обещания и возвращает новый результат
66+
// - Действие - Делегат на функцию с одним параметром, которая принимает результат исполнения
67+
// текущего обещания и возвращает новый результат
68+
//
69+
// Возвращаемое значение:
70+
// Обещание - Обещание об исполнение алгоритма над результатом исполнения текущего обещания
71+
//
72+
Функция Затем(Знач Алгоритм)
73+
```
74+
75+
#### Поймать
76+
77+
```bsl
78+
// В случае если в нижестоящих обещаниях будет выброшено исключение, оно будет перехвачено
79+
// и передано в указанный алгоритм.
80+
//
81+
// Параметры:
82+
// Алгоритм - Строка - Лямбда выражение функция с одним параметром, которая принимает ИнформацияОбОшибке
83+
// нижестоящих обещаний и возвращает новый результат
84+
// - Действие - Делегат на функцию с одним параметром, которая принимает ИнформацияОбОшибке
85+
// нижестоящих обещаний и возвращает новый результат
86+
//
87+
// Возвращаемое значение:
88+
// Обещание - Обещание о выполнении алгоритма в случае возникновения исключения
89+
//
90+
Функция Поймать(Алгоритм)
91+
```

packagedef

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
Описание.Имя("async")
2+
.Версия("0.1.0")
3+
.Автор("Кирилл Черненко")
4+
.АдресАвтора("https://github.com/sfaqer")
5+
.Описание("Фреймворк асинхронного исполнения для OneScript")
6+
.ВерсияСреды("1.8.4")
7+
.ВключитьФайл("src")
8+
.ВключитьФайл("README.md")
9+
.ВключитьФайл("LICENSE.md")
10+
.РазработкаЗависитОт("1testrunner")
11+
.РазработкаЗависитОт("coverage")
12+
.РазработкаЗависитОт("fs")
13+
.РазработкаЗависитОт("json")
14+
.РазработкаЗависитОт("asserts")
15+
.ЗависитОт("lambdas", "0.1.3")
16+
;
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
#Область ОписаниеПеременных
2+
3+
Перем Алгоритм; // Алгоритм выполняемый асинхронно
4+
Перем Параметры; // Параметры алгоритма
5+
Перем Предыдущий; // Предыдущее обещание результат которого передаётся как параметр в алгоритм
6+
Перем ПерехватчикИсключения; // Это обещание перехватчик исключения
7+
8+
#КонецОбласти
9+
10+
#Область СлужебныеПроцедурыИФункции
11+
12+
Процедура ПриСозданииОбъекта(пАлгоритм, пПараметры, пПерехватчикИсключения)
13+
14+
Если ТипЗнч(пПараметры) = Тип("Обещание") Тогда
15+
Предыдущий = пПараметры;
16+
Иначе
17+
Параметры = пПараметры;
18+
КонецЕсли;
19+
20+
Алгоритм = пАлгоритм;
21+
ПерехватчикИсключения = пПерехватчикИсключения;
22+
23+
КонецПроцедуры
24+
25+
#КонецОбласти
26+
27+
#Область СлужебныйПрограммныйИнтерфейс
28+
29+
Функция Алгоритм() Экспорт
30+
Возврат Алгоритм;
31+
КонецФункции
32+
33+
Функция Параметры() Экспорт
34+
Возврат Параметры;
35+
КонецФункции
36+
37+
Функция Предыдущий() Экспорт
38+
Возврат Предыдущий;
39+
КонецФункции
40+
41+
Функция ПерехватчикИсключения() Экспорт
42+
Возврат ПерехватчикИсключения;
43+
КонецФункции
44+
45+
#КонецОбласти
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
#Использовать lambdas
2+
3+
#Область ОписаниеПеременных
4+
5+
Перем Задание; // Задание которое исполняет обещание
6+
7+
// Контекст исполнения обещания
8+
Перем КонтекстВыполнения; // BSLLS:UnusedLocalVariable-off Доступ через рефлектор в служебном интерфейсе
9+
10+
#КонецОбласти
11+
12+
#Область ПрограммныйИнтерфейс
13+
14+
// Получает результат исполнения обещания
15+
//
16+
// Параметры:
17+
// Таймаут - Число - Время в миллисекундах в течении которого нужно ожидать завершения задания,
18+
// если время ожидания будет превышено, будет выброшено исключение
19+
//
20+
// Возвращаемое значение:
21+
// Произвольный - Результат исполнения обещания
22+
//
23+
Функция Получить(Таймаут = 0) Экспорт
24+
25+
Дождались = Задание.ОжидатьЗавершения(Таймаут);
26+
27+
Если Дождались И Задание.Состояние = СостояниеФоновогоЗадания.Завершено Тогда
28+
Возврат Задание.Результат;
29+
ИначеЕсли Не Дождались Тогда
30+
ВызватьИсключение "Превышено время ожидания получения результата";
31+
Иначе
32+
ВызватьИсключение ПодробноеПредставлениеОшибки(Задание.ИнформацияОбОшибке);
33+
КонецЕсли;
34+
35+
КонецФункции
36+
37+
// После получения результата запускает ещё одно задание которое будет асинхронно
38+
// выполнять переданный алгоритм над результатом
39+
//
40+
// Параметры:
41+
// Алгоритм - Строка - Лямбда выражение функция с одним параметром, которая принимает результат исполнения
42+
// текущего обещания и возвращает новый результат
43+
// - Действие - Делегат на функцию с одним параметром, которая принимает результат исполнения
44+
// текущего обещания и возвращает новый результат
45+
//
46+
// Возвращаемое значение:
47+
// Обещание - Обещание об исполнение алгоритма над результатом исполнения текущего обещания
48+
//
49+
Функция Затем(Знач Алгоритм) Экспорт
50+
51+
Если ТипЗнч(Алгоритм) = Тип("Строка") Тогда
52+
53+
Алгоритм = Лямбда.Выражение(Алгоритм)
54+
.Интерфейс(ФункциональныеИнтерфейсы.УниФункция())
55+
.ВДействие();
56+
57+
КонецЕсли;
58+
59+
Результат = Новый Обещание(Алгоритм, ЭтотОбъект);
60+
61+
АсинхронностьСлужебный.ЗапуститьВыполнениеОбещания(Результат);
62+
63+
Возврат Результат;
64+
65+
КонецФункции
66+
67+
// В случае если в нижестоящих обещаниях будет выброшено исключение, оно будет перехвачено
68+
// и передано в указанный алгоритм.
69+
//
70+
// Параметры:
71+
// Алгоритм - Строка - Лямбда выражение функция с одним параметром, которая принимает ИнформацияОбОшибке
72+
// нижестоящих обещаний и возвращает новый результат
73+
// - Действие - Делегат на функцию с одним параметром, которая принимает ИнформацияОбОшибке
74+
// нижестоящих обещаний и возвращает новый результат
75+
//
76+
// Возвращаемое значение:
77+
// Обещание - Обещание о выполнении алгоритма в случае возникновения исключения
78+
//
79+
Функция Поймать(Алгоритм) Экспорт
80+
81+
Если ТипЗнч(Алгоритм) = Тип("Строка") Тогда
82+
83+
Алгоритм = Лямбда.Выражение(Алгоритм)
84+
.Интерфейс(ФункциональныеИнтерфейсы.УниФункция())
85+
.ВДействие();
86+
87+
КонецЕсли;
88+
89+
Результат = Новый Обещание(Алгоритм, ЭтотОбъект, Истина);
90+
91+
АсинхронностьСлужебный.ЗапуститьВыполнениеОбещания(Результат);
92+
93+
Возврат Результат;
94+
95+
КонецФункции
96+
97+
#КонецОбласти
98+
99+
#Область СлужебныеПроцедурыИФункции
100+
101+
Процедура ПриСозданииОбъекта(Алгоритм, Параметры, ПерехватчикИсключения = Ложь)
102+
103+
КонтекстВыполнения = Новый КонтекстВыполненияОбещания(
104+
Алгоритм,
105+
Параметры,
106+
ПерехватчикИсключения
107+
);
108+
109+
КонецПроцедуры
110+
111+
#КонецОбласти
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
#Область ОписаниеПеременных
2+
3+
Перем Рефлектор; // Для доступа к приватным полям обещания
4+
5+
#КонецОбласти
6+
7+
#Область СлужебныйПрограммныйИнтерфейс
8+
9+
Процедура ЗапуститьВыполнениеОбещания(Обещание) Экспорт
10+
11+
Параметры = Новый Массив;
12+
Параметры.Добавить(Обещание);
13+
14+
Задание = ФоновыеЗадания.Выполнить(ЭтотОбъект, "ВыполнитьОбещание", Параметры);
15+
16+
Рефлектор.УстановитьСвойство(Обещание, "Задание", Задание);
17+
18+
КонецПроцедуры
19+
20+
Функция ВыполнитьОбещание(Обещание) Экспорт
21+
22+
Контекст = Рефлектор.ПолучитьСвойство(
23+
Обещание,
24+
"КонтекстВыполнения"
25+
);
26+
27+
Если Контекст.Предыдущий() <> Неопределено Тогда
28+
29+
Если Контекст.ПерехватчикИсключения() Тогда
30+
31+
Попытка
32+
Результат = Контекст.Предыдущий()
33+
.Получить();
34+
Исключение
35+
Результат = Контекст.Алгоритм()
36+
.Выполнить(ИнформацияОбОшибке());
37+
КонецПопытки;
38+
39+
Возврат Результат;
40+
41+
Иначе
42+
43+
Возврат Контекст.Алгоритм()
44+
.Выполнить(Контекст.Предыдущий().Получить());
45+
46+
КонецЕсли;
47+
48+
Иначе
49+
50+
Параметры = Контекст.Параметры();
51+
52+
СтрокаПараметров = Новый Массив();
53+
54+
Для Счетчик = 0 По Параметры.ВГраница() Цикл
55+
СтрокаПараметров.Добавить(СтрШаблон("Параметры[%1]", Счетчик));
56+
КонецЦикла;
57+
58+
Возврат Вычислить(СтрШаблон("Контекст.Алгоритм().Выполнить(%1)", СтрСоединить(СтрокаПараметров, ",")));
59+
60+
КонецЕсли;
61+
62+
КонецФункции
63+
64+
#КонецОбласти
65+
66+
Рефлектор = Новый Рефлектор();

0 commit comments

Comments
 (0)