Comment chaîner et partager des résultats antérieurs avec Promises

J'utilise la bibliothèque bluebird et j'ai besoin de faire une série de requêtes HTTP et j'ai besoin de certaines des données de réponse à la prochaine requête HTTP. J'ai construit une fonction qui gère mes demandes appelées callhttp() . Cela prend une url et le corps d'un POST.

Je l'appelle comme ceci:

 var payload = '{"Username": "joe", "Password": "password"}'; var join = Promise.join; join( callhttp("172.16.28.200", payload), callhttp("172.16.28.200", payload), callhttp("172.16.28.200", payload), function (first, second, third) { console.log([first, second, third]); }); 

La première requête obtient une clé API qui doit être transmise à la deuxième demande et ainsi de suite. Comment obtenir les données de réponse de la première demande?

METTRE À JOUR

C'est la fonction callhttp :

 var Promise = require("bluebird"); var Request = Promise.promisify(require('request')); function callhttp(host, body) { var options = { url: 'https://' + host + '/api/authorize', method: "POST", headers: { 'content-type': 'application/json' }, body: body, strictSSL: false }; return Request(options).spread(function (response) { if (response.statusCode == 200) { // console.log(body) console.log(response.connection.getPeerCertificate().subject.CN) return { data: response.body }; } else { // Just an example, 200 is not the only successful code throw new Error("HTTP Error: " + response.statusCode ); } }); } 

    Il existe quelques modèles pour les promesses dépendantes et le passage des données de l'un à l'autre. Lequel fonctionne le mieux dépend de savoir si vous avez seulement besoin des données précédentes dans l'appel suivant ou si vous avez besoin d'accéder à toutes les données antérieures. Voici plusieurs modèles:

    Résultat d'alimentation d'un à l'autre

     callhttp(url1, data1).then(function(result1) { // result1 is available here return callhttp(url2, data2); }).then(function(result2) { // only result2 is available here return callhttp(url3, data3); }).then(function(result3) { // all three are done now, final result is in result3 }); 

    Affectez les résultats intermédiaires à un champ d'application supérieur

     var r1, r2, r3; callhttp(url1, data1).then(function(result1) { r1 = result1; return callhttp(url2, data2); }).then(function(result2) { r2 = result2; // can access r1 or r2 return callhttp(url3, data3); }).then(function(result3) { r3 = result3; // can access r1 or r2 or r3 }); 

    Accumuler les résultats dans un objet

     var results = {}; callhttp(url1, data1).then(function(result1) { results.result1 = result1; return callhttp(url2, data2); }).then(function(result2) { results.result2 = result2; // can access results.result1 or results.result2 return callhttp(url3, data3); }).then(function(result3) { results.result3 = result3; // can access results.result1 or results.result2 or results.result3 }); 

    Nest, donc tous les résultats précédents peuvent être consultés

     callhttp(url1, data1).then(function(result1) { // result1 is available here return callhttp(url2, data2).then(function(result2) { // result1 and result2 available here return callhttp(url3, data3).then(function(result3) { // result1, result2 and result3 available here }); }); }) 

    Briser la chaîne en pièces indépendantes, collecter des résultats

    Si certaines parties de la chaîne peuvent se dérouler indépendamment, plutôt que l'une après l'autre, vous pouvez les lancer séparément et utiliser Promise.all() pour savoir quand ces pièces multiples sont terminées et vous disposerez alors de toutes les données de ces pièces indépendantes :

     var p1 = callhttp(url1, data1); var p2 = callhttp(url2, data2).then(function(result2) { return someAsync(result2); }).then(function(result2a) { return someOtherAsync(result2a); }); var p3 = callhttp(url3, data3).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 });