Kurso de Raku / Funkcia, samtempa, reaktiva kaj reta programado / Samtempa programado / Promesoj
Ĵuroj (Vow) 🆕
Kiam vi mem vokas $p.keep(...), ĉiu, kiu tenas
$p, povus decidi ĝin. Foje vi volas la malon: la kodo, kiu
produktas la rezulton, estu la sola afero rajtigita decidi la
promeson, dum ĉiuj aliaj rajtu nur atendi ĝin. Tiu apartigo estas
ĵuro.
Promise.new donas al vi promeson; voki .vow
sur ĝi transdonas Vow — la solan rajton plenumi aŭ rompi
tiun promeson. De tiam la promeso estas destinita esti nurlega: ĝi estas
decidata tra la ĵuro. La kutima formo estas produktanto, kiu tenas la
ĵuron privata kaj redonas nur la promeson:
sub after($seconds) {
my $p = Promise.new;
my $v = $p.vow; # prenu la decid-rajton
start {
sleep $seconds;
$v.keep("done after $seconds s"); # decidu ĝin tra la ĵuro
}
return $p; # vokantoj ricevas nur la legflankon
}
my $job = after(0.2);
say $job.status; # Planned
say await $job; # done after 0.2 sPreni la ĵuron faras la promeson vere nurlega: de tiu momento
$p.keep kaj $p.break estas rifuzataj, ĉar la
ĵuro nun posedas la solan rajton decidi ĝin.
my $p = Promise.new;
my $v = $p.vow;
$p.keep(1); # mortas: Access denied to keep/break this Promise; already vowedDo la vokanto povas await-i la promeson, ĉenigi
.then al ĝi aŭ kontroli ĝian .status, sed ĝi
ne povas decidi ĝin — nur la tenanto de la ĵuro povas. Tiel bibliotekoj
transformas revok- kaj event-bazitajn API-ojn en ordinarajn promesojn:
krei promeson, teni ĝian ĵuron kaj plenumi ĝin el ene de la revoko, kiam
la evento finfine alvenas.
Ĉi tio estas ankaŭ precize tio, kion start faras por vi
malantaŭ la kulisoj — ĝi faras promeson, tenas la ĵuron por si mem kaj
decidas la promeson per la valoro de la bloko (aŭ rompas ĝin, se la
bloko mortas). Fari la promeson kaj ĝian ĵuron mane simple ebligas al vi
fari la samon, kiam la rezulto ne venas el unu sola bloko da kodo.
Kursa navigado
← La stato de promeso 🆕 | Ĉenigu promeson →
💪 Aŭ iru rekte al la ekzercoj de ĉi tiu
sekcio.