Maison >interface Web >js tutoriel >Comment accéder aux résultats précédents lors du chaînage de promesses en JavaScript ?
Enchaînement des promesses et partage des résultats précédents
Dans ce scénario, vous devez effectuer une série de requêtes HTTP, en transmettant les données de réponse d'une requête au suivant en utilisant Promise.join de Bluebird. Le défi réside dans l'accès aux données de réponse de la première requête.
Pour y parvenir, vous pouvez utiliser l'une des plusieurs approches suivantes :
Option 1 : transmettre le résultat de l'un au suivant
Cette approche consiste à enchaîner directement les promesses, en transmettant le résultat d'une requête en entrée à la suivante. Chaque gestionnaire .then() suivant a accès uniquement au résultat le plus récent :
Promise.join( callhttp("172.16.28.200", payload), callhttp("172.16.28.200", payload), callhttp("172.16.28.200", payload) ).then(function(first, second, third) { console.log([first, second, third]); });
Cependant, cette approche ne permet pas d'accéder aux résultats précédents.
Option 2 : Attribuer Résultats intermédiaires à une portée supérieure
Ici, vous attribuez des résultats intermédiaires à des variables déclarées dans une portée supérieure. Cela donne accès à tous les résultats précédents dans les gestionnaires .then() suivants :
var r1, r2, r3; Promise.join( callhttp("172.16.28.200", payload), callhttp("172.16.28.200", payload), callhttp("172.16.28.200", payload) ).then(function(result1, result2, result3) { r1 = result1; r2 = result2; r3 = result3; });
Option 3 : Accumuler les résultats dans un seul objet
Cette approche implique la création d'un objet pour accumuler les résultats au fur et à mesure qu’ils deviennent disponibles. Chaque gestionnaire .then() ajoute son résultat à l'objet, permettant d'accéder à tous les résultats précédents :
var results = {}; Promise.join( callhttp("172.16.28.200", payload), callhttp("172.16.28.200", payload), callhttp("172.16.28.200", payload) ).then(function(result1, result2, result3) { results.result1 = result1; results.result2 = result2; results.result3 = result3; });
Option 4 : Nest Promises
Les promesses d'imbrication vous permettent pour accéder à tous les résultats précédents dans les scopes imbriqués :
Promise.join( callhttp("172.16.28.200", payload), callhttp("172.16.28.200", payload), callhttp("172.16.28.200", payload) ).then(function(result1) { // result1 is available here return Promise.join( callhttp("172.16.28.200", payload), callhttp("172.16.28.200", payload) ).then(function(result2) { // result1 and result2 are available here return Promise.join( callhttp("172.16.28.200", payload) ).then(function(result3) { // result1, result2 and result3 are available here }); }); })
Option 5 : Rompre la chaîne en indépendant Pièces
Si certaines parties de la chaîne peuvent s'exécuter indépendamment, vous pouvez rompre la chaîne, les lancer séparément et utiliser Promise.all() pour collecter les résultats :
var p1 = callhttp("172.16.28.200", payload); var p2 = callhttp("172.16.28.200", payload).then(function(result2) { return someAsync(result2); }).then(function(result2a) { return someOtherAsync(result2a); }); var p3 = callhttp("172.16.28.200", payload).then(function(result3) { return someAsync(result3); }); Promise.all([p1, p2, p3]).then(function(results) { // multiple results available in results array // that can be processed further here with // other promises });
Option 6 : Séquence avec wait dans ES7
Les promesses fournissent un moyen de séquencer des opérations asynchrones. Dans ES7, vous pouvez utiliser wait pour séquencer ces opérations, simplifiant ainsi le processus :
async function someFunction() { const r1 = await callhttp("172.16.28.200", payload); // can use r1 here to formulate second http call const r2 = await callhttp("172.16.28.200", payload); // can use r1 and r2 here to formulate third http call const r3 = await callhttp("172.16.28.200", payload); // do some computation that has access to r1, r2 and r3 return someResult; } someFunction().then(result => { // process final result here }).catch(err => { // handle error here });
Notez que chaque option a ses propres avantages et inconvénients. Choisissez celui qui correspond le mieux aux exigences spécifiques de votre application.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!