Curso de Raku / Programación funcional, concurrente, reactiva y web / Programación concurrente / Promesas
Su propia promesa 🆕
Todas las promesas vistas hasta ahora venían de start.
Pero también puedes crear una directamente con Promise.new
— una promesa que aún no ha terminado — y resolverla tú mismo cuando el
resultado (o la noticia) esté listo. .keep la cumple con un
valor:
my $p = Promise.new; # a fresh, unsettled promise
$p.keep(42); # fulfil it with a value
say await $p; # 42.break es el caso de fallo. Esperar una promesa rota
relanza el error, igual que ocurre con un bloque start que
murió, y si nadie la
captura, esa excepción detiene el programa:
my $p = Promise.new;
$p.break('disk full');
say await $p; # dies here with 'disk full'
say 'never reached'; # this line does not runPara seguir adelante, captura el fallo con try,
exactamente como harías alrededor de cualquier código que pueda
morir:
my $p = Promise.new;
$p.break('disk full');
my $result = try await $p;
say $result // "the job failed: $!"; # the job failed: disk fullSi el desenlace ya se conoce, dos atajos crean una promesa que nace
ya resuelta: Promise.kept($value) y
Promise.broken($error).
say await Promise.kept(7); # 7¿Por qué crear una promesa a mano? Porque no todos los resultados
vienen de un bloque start. Un evento que se dispara más
tarde, un mensaje que llega, una retrollamada de otra biblioteca:
Promise.new te permite convertir cualquiera de ellos en una
promesa que el resto del programa puede await y combinar
como cualquier otra.
Navegación del curso
← Quiz — Combinar promesas | El estado de una promesa 🆕 →
💪 O ve directamente a los ejercicios de esta
sección.