Bluebird, promesses et puis ()

Je n'utilise que Bluebird depuis quelques jours, mais je veux passer tout mon ancien code et le promisify 🙂

Mon problème est que je sais pas toujours le flux des commandes then() .

Considérez ces deux blocs:

UNE

 methodThatReturnsAPromise().then(task2).then(task3); 

B

 var promise = methodThatReturnsAPromise(); promise.then(task2) promise.then(task3); 
  1. Dans le scénario A task3 obtiendra le résultat de la task2 ? En B, ils obtiennent tous le résultat de la première promesse?

  2. Comment le second diffère-t-il de l'exécution de Promise.all de Bluebird?

  3. Comment ces A / B / Promise.allPromise.all différents quand il s'agit d'utiliser la méthode de catch (où le met-je).

Désolé, c'est un tas de questions en un seul.

Bienvenue dans le merveilleux monde des promesses.

Comment fonctionne then votre exemple

Votre affirmation en 1 est correcte. Nous pouvons simuler une promesse de résolution dans Bluebird en utilisant Promise.resolve sur une valeur.

Montrons ceci:

Obtenons une fonction qui renvoie une promesse:

 function foo(){ return Promise.resolve("Value"); } foo().then(alert); 

Ce court extrait va alerter "Value" comme on peut le voir .

Maintenant, créons deux promesses supplémentaires, chacune qui alerte et renvoie des valeurs différentes.

 function task2(e){ alert("In two got " + e); return " Two "; } function task3(e){ alert("In three got " + e); return " Three "; } 

Ainsi, comme vous pouvez le voir dans votre premier code, il résolvira en une chaîne, chacune ayant la valeur de la partie précédente.

Dans le deuxième exemple, la tâche 2 et la tâche 3 obtiendront la même valeur et seront également exécutées ensemble (c'est-à-dire que la tâche 3 n'attendra pas la tâche 2). Vous pouvez le voir ici .

Promise.all

Promise.all (ou tout simplement renvoyer un tableau à partir d'un gestionnaire d'exécution then , puis utiliser .spread ) est utilisé pour attendre que plusieurs résultats soient complets. Sur votre exemple, vous accrochez un seul résultat en plusieurs parties.

La prise

Vous mettez toujours des captures où vous voulez que l'erreur soit détectée. Comme vous le feriez normalement dans un code synchrone. N'oubliez pas de toujours donner une promesse ou un code promisifié.

Dans le scénario A task3 obtiendra le résultat de la tâche2? En B, ils obtiennent tous le résultat de la première promesse?

Oui.

Comment le second diffère-t-il de l'exécution de Promise.all de Bluebird?

Vous ne recevez pas les résultats des tâches (parallèles) 2 et 3 dans une nouvelle promesse.

Comment ces A / B / Promise.all sont-ils différents quand il s'agit d'utiliser la méthode de capture (où le met-je).

Habituellement, vous le metriez à la fin de la chaîne, sauf que vous voulez rattraper une erreur spécifique.

 promise.catch() // handles rejections of this promise promise.then(task2).catch() // handles rejections from either promise or task2 // if promise is rejected, task2 will not be executed Promise.all(promise.then(task2), promise.then(task3)).catch() // handles rejections from any. // if promise is rejected, neither task2 nor task3 will be executed // if task2 or task3 throw, the error will immediately handled // and the other task will not be affected (but its result is unavailable) 

Vous n'obtenez pas un principe simple de chaînage

Dans le premier, on peut écrire comme

 var promise = methodThatReturnsAPromise(), promise1 = promise.then(task2); promise1.then(task3); 

Dans le deuxième cas

 var promise = methodThatReturnsAPromise(); promise.then(task2) promise.then(task3); 

J'espère que cela explique la différence b / w les deux