2017-10-11 7 views
1

Comment exécuter deux promesses, l'une après l'autre?Quel est l'idiome d'une chaîne de promesses?

Par exemple, en JavaScript je peux

var promise1 = new Promise(); 
var promise2 = new Promise(); 

// await returns a result2 from promise2 
await promise1.then(() => promise2); 

Comment puis-je faire la même chose en Perl 6?

my $promise1 = Promise.new(); 
my $promise2 = Promise.new(); 

// Here I get only Promise2 object, not its result 
await promise1.then({ $promise2 }); 

Dois-je attendre un $ promise2 comme ça?

await promise1.then({ await $promise2 }); 
+3

Ceci est faux, même en JavaScript. Vous auriez dû utiliser 'await Promise.all ([promettre1, promettre2])' (puis obtenir la seconde valeur du tableau de résultat si vous cherchez cela), sinon vous pourriez obtenir des rejections non gérées si 'promet2 'rejette avant que la promesse1 ne s'installe. Je suis certain qu'il y a un Perl équivalent à 'Promise.all' aussi bien – Bergi

+1

Votre premier bloc de code n'est pas une série de promesses. Les deux s'exécutent en parallèle. – jfriend00

+0

@Bergi, et si je dois utiliser dans la promesse2 le résultat de la promesse1? Supposons que la promesse1 renvoie un jeton et que la promesse2 l'utilise. Habituellement j'utiliser quelque chose le long des lignes 'promise1.then (result1 => promise2)' Promise.all exécute tous en parallèle, et non sequentally –

Répondre

4

Si vous voulez faire deux opérations asynchrones l'un après l'autre, alimentant le résultat de la première dans la seconde, alors ce serait juste un cas de faire deux await s:

my $result = await something-that-returns-a-Promise(); await something-else-returning-a-Promise-using($result);

ou sans la variable intermédiaire:

await something-else-returning-a-Promise-using(await something-that-returns-a-Promise());

Pas besoin de .then du tout.

+0

@jnthn Serait-il possible/logique que 'Foo.then: & code', en appelant' & code', passe automatiquement '$ _' lié au résultat de' Foo'? – raiph

+0

@raiph Il passe le 'Promise' que' .then' a été appelé en tant qu'argument; si '& code' est un simple bloc, il finira dans' $ _'. Ainsi, vous pouvez faire '$ promise.then ({something-with (.result)})', par exemple. La raison pour laquelle nous passons dans la «Promesse», pas le résultat, est que la «Promesse» a peut-être été brisée. Appeler '.result' et ne gérer aucune exception va à son tour casser le' Promise' renvoyé par '.then', ce qui signifie que les erreurs non gérées sont propagées dans la chaîne. –

+0

@jnthn Parfait. Merci. :) – raiph