Курс по Raku / Функционално, паралелно, реактивно и уеб програмиране / Паралелно програмиране / Обещания
Свързване и комбиниране
Обещанията стават още по-мощни, когато ги съчетавате. Най-честата
нужда е да изчакате няколко наведнъж.
await приема списък от обещания и връща резултатите им по
ред:
my @jobs = (start { 1 }), (start { 2 }), (start { 3 });
say await @jobs; # (1 2 3)
say [+] await @jobs; # 6Трите задачи вървят паралелно; await @jobs изчаква
всички и връща (1, 2, 3). Понеже резултатите се връщат в
същия ред като обещанията, можете да ги свиете както обикновено.
Можете и да свържете работа с обещание чрез .then, който
изпълнява следващ блок, щом обещанието приключи. Вътре в него
.result е стойността на първоначалното обещание:
my $p = start { 10 };
my $q = $p.then({ .result * 2 });
say await $q; # 20$q е ново обещание, което удвоява резултата на
$p. Изчакването му дава 20.
Блокът няма изричен параметър, така че получава приключилото обещание
като променливата тема $_ — затова голото
.result работи: всъщност това е $_.result. Ако
предпочитате да дадете име на това обещание, използвайте остър блок:
my $q = $p.then(-> $prev { $prev.result * 2 });Това се държи по абсолютно същия начин; $prev е
първоначалното обещание $p, а $prev.result е
неговата стойност.
С start, await и .then можете
да описвате цели конвейери от паралелна работа: да пускате много задачи,
да съчетавате резултатите им и да строите нови задачи от стари — и
всичко това, без да докосвате нишка направо.
Практика
Направете 1 тест върху съдържанието на тази тема.
Навигация в курса
← Тест — Обещания | Тест — Комбиниране на обещания →
💪 Или преминете направо към упражненията в този
раздел.