Skip to content

Commit

Permalink
1. Модуль АсинхронностьСлужебный переименован в ОбещанияСлужебный
Browse files Browse the repository at this point in the history
2. В API добавлена возможность ожидать завершения массива обещаний
  • Loading branch information
sfaqer committed Aug 11, 2023
1 parent 588bb2e commit be94e2e
Show file tree
Hide file tree
Showing 6 changed files with 118 additions and 5 deletions.
12 changes: 12 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,18 @@
Функция ВыполнитьДелегат(Действие, Параметры)
```

#### ОжидатьВсе

```bsl
// Ожидает исполнение всех переданных обещаний
//
// Параметры:
// Обещания - Массив из Обещание - Обещания которых ожидаем
// Таймаут - Число- Количество миллисекунд по истечении которых будет выброшено исключение
//
Процедура ОжидатьВсе(Обещания, Таймаут = 0) Экспорт
```

### Класс Обещание

#### Получить
Expand Down
3 changes: 2 additions & 1 deletion packagedef
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
Описание.Имя("async")
.Версия("0.2.0")
.Версия("0.2.1")
.Автор("Кирилл Черненко")
.АдресАвтора("https://github.com/sfaqer")
.Описание("Фреймворк асинхронного исполнения для OneScript")
Expand All @@ -13,4 +13,5 @@
.РазработкаЗависитОт("json")
.РазработкаЗависитОт("asserts")
.ЗависитОт("lambdas", "0.1.3")
.ЗависитОт("fluent", "0.6.1")
;
4 changes: 2 additions & 2 deletions src/internal/Классы/Обещание.os
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@

Результат = Новый Обещание(Алгоритм, ЭтотОбъект);

АсинхронностьСлужебный.ЗапуститьВыполнениеОбещания(Результат);
ОбещанияСлужебный.ЗапуститьВыполнениеОбещания(Результат);

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

Expand Down Expand Up @@ -88,7 +88,7 @@

Результат = Новый Обещание(Алгоритм, ЭтотОбъект, Истина);

АсинхронностьСлужебный.ЗапуститьВыполнениеОбещания(Результат);
ОбещанияСлужебный.ЗапуститьВыполнениеОбещания(Результат);

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

Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
#Использовать fluent

#Область ОписаниеПеременных

Перем Рефлектор; // Для доступа к приватным полям обещания
Expand Down Expand Up @@ -61,6 +63,20 @@

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

Процедура ОжидатьВсе(Обещания, Таймаут) Экспорт

Задания = ПроцессорыКоллекций.ИзКоллекции(Обещания)
.Обработать("Обещание -> Рефлектор.ПолучитьСвойство(Обещание, ""Задание"")", ЭтотОбъект)
.ВМассив();

Результат = ФоновыеЗадания.ОжидатьВсе(Задания, Таймаут);

Если Не Результат Тогда
ВызватьИсключение "Превышено время ожидания получения результата";
КонецЕсли;

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

#КонецОбласти

Рефлектор = Новый Рефлектор();
14 changes: 12 additions & 2 deletions src/Модули/Обещания.os
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@

Результат = Новый Обещание(Алгоритм, Параметры);

АсинхронностьСлужебный.ЗапуститьВыполнениеОбещания(Результат);
ОбещанияСлужебный.ЗапуститьВыполнениеОбещания(Результат);

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

Expand All @@ -40,10 +40,20 @@

Результат = Новый Обещание(Действие, Параметры);

АсинхронностьСлужебный.ЗапуститьВыполнениеОбещания(Результат);
ОбещанияСлужебный.ЗапуститьВыполнениеОбещания(Результат);

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

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

// Ожидает исполнение всех переданных обещаний
//
// Параметры:
// Обещания - Массив из Обещание - Обещания которых ожидаем
// Таймаут - Число- Количество миллисекунд по истечении которых будет выброшено исключение
//
Процедура ОжидатьВсе(Обещания, Таймаут = 0) Экспорт
ОбещанияСлужебный.ОжидатьВсе(Обещания, Таймаут);
КонецПроцедуры

#КонецОбласти
74 changes: 74 additions & 0 deletions tests/Обещания.os
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,80 @@

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

&Тест
Процедура ОжидаемВсе() Экспорт

// Дано

Параметры = Новый Массив();
Параметры.Добавить(1);
Параметры.Добавить(2);

Ждем = Новый Массив();

// BSLLS:DuplicatedInsertionIntoCollection-off
// BSLLS:DuplicateStringLiteral-off
Ждем.Добавить(Обещания.ВыполнитьЛямбду("(П, В) -> Возврат СложитьСЗадержкой(П, В)", ЭтотОбъект, Параметры));
Ждем.Добавить(Обещания.ВыполнитьЛямбду("(П, В) -> Возврат СложитьСЗадержкой(П, В)", ЭтотОбъект, Параметры));
Ждем.Добавить(Обещания.ВыполнитьЛямбду("(П, В) -> Возврат СложитьСЗадержкой(П, В)", ЭтотОбъект, Параметры));
Ждем.Добавить(Обещания.ВыполнитьЛямбду("(П, В) -> Возврат СложитьСЗадержкой(П, В)", ЭтотОбъект, Параметры));
Ждем.Добавить(Обещания.ВыполнитьЛямбду("(П, В) -> Возврат СложитьСЗадержкой(П, В)", ЭтотОбъект, Параметры));
Ждем.Добавить(Обещания.ВыполнитьЛямбду("(П, В) -> Возврат СложитьСЗадержкой(П, В)", ЭтотОбъект, Параметры));
Ждем.Добавить(Обещания.ВыполнитьЛямбду("(П, В) -> Возврат СложитьСЗадержкой(П, В)", ЭтотОбъект, Параметры));
Ждем.Добавить(Обещания.ВыполнитьЛямбду("(П, В) -> Возврат СложитьСЗадержкой(П, В)", ЭтотОбъект, Параметры));
// BSLLS:DuplicatedInsertionIntoCollection-on
// BSLLS:DuplicateStringLiteral-on

// Когда

Обещания.ОжидатьВсе(Ждем);

// Тогда

Для каждого Обещание Из Ждем Цикл

Утверждения.ПроверитьРавенство(Обещание.Состояние(), СостояниеФоновогоЗадания.Завершено);
Утверждения.ПроверитьРавенство(Обещание.Получить(), 3);

КонецЦикла;

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

Процедура НеДождалисьВсех() Экспорт

// Дано

Параметры = Новый Массив();
Параметры.Добавить(1);
Параметры.Добавить(2);

Ждем = Новый Массив();

// BSLLS:DuplicatedInsertionIntoCollection-off
// BSLLS:DuplicateStringLiteral-off
Ждем.Добавить(Обещания.ВыполнитьЛямбду("(П, В) -> Возврат СложитьСЗадержкой(П, В)", ЭтотОбъект, Параметры));
Ждем.Добавить(Обещания.ВыполнитьЛямбду("(П, В) -> Возврат СложитьСЗадержкой(П, В)", ЭтотОбъект, Параметры));
Ждем.Добавить(Обещания.ВыполнитьЛямбду("(П, В) -> Возврат СложитьСЗадержкой(П, В)", ЭтотОбъект, Параметры));
Ждем.Добавить(Обещания.ВыполнитьЛямбду("(П, В) -> Возврат СложитьСЗадержкой(П, В)", ЭтотОбъект, Параметры));
Ждем.Добавить(Обещания.ВыполнитьЛямбду("(П, В) -> Возврат СложитьСЗадержкой(П, В)", ЭтотОбъект, Параметры));
Ждем.Добавить(Обещания.ВыполнитьЛямбду("(П, В) -> Возврат СложитьСЗадержкой(П, В)", ЭтотОбъект, Параметры));
Ждем.Добавить(Обещания.ВыполнитьЛямбду("(П, В) -> Возврат СложитьСЗадержкой(П, В)", ЭтотОбъект, Параметры));
Ждем.Добавить(Обещания.ВыполнитьЛямбду("(П, В) -> Возврат СложитьСЗадержкой(П, В)", ЭтотОбъект, Параметры));
// BSLLS:DuplicatedInsertionIntoCollection-on
// BSLLS:DuplicateStringLiteral-on

// Тогда

Параметры = Новый Массив;
Параметры.Добавить(Ждем);
Параметры.Добавить(10);

Ожидаем.Что(Обещания)
.Метод("ОжидатьВсе", Параметры)
.ВыбрасываетИсключение("Превышено время ожидания получения результата");

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

Функция СложитьСЗадержкой(Первое, Второе) Экспорт

Приостановить(100);
Expand Down

0 comments on commit be94e2e

Please sign in to comment.