w3schools then sincronas promises funciones from encadenar ejemplo await async javascript node.js bluebird

javascript - then - return value from promise



Cómo encadenar y compartir resultados anteriores con Promesas (1)

Existen algunos modelos para promesas dependientes y para pasar datos de uno a otro. Cuál funciona mejor depende de si solo necesita los datos anteriores en la próxima llamada o si necesita acceder a todos los datos anteriores. Aquí hay varios modelos:

Resultado de alimentación de uno a siguiente

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 });

Asignar resultados intermedios a un alcance superior

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 });

Acumular resultados en un objeto

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, para que se pueda acceder a todos los resultados anteriores

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 }); }); })

Romper la cadena en pedazos independientes, recoger resultados

Si algunas partes de la cadena pueden proceder de forma independiente, en lugar de una tras otra, puede iniciarlas por separado y usar Promise.all() para saber cuándo se realizan esas múltiples piezas y luego tendrá todos los datos de esas piezas independientes :

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 });

Secuencia con await en ES7

Dado que la cadena de promesa es solo un mecanismo para secuenciar operaciones asincrónicas, en ES7, también puede usar await y luego los resultados intermedios están disponibles en el mismo alcance (quizás más simple que los ámbitos separados de los .then() encadenados .then() ):

async function someFunction(...) { const r1 = await callhttp(url1, data1); // can use r1 here to formulate second http call const r2 = await callhttp(url2, data2); // can use r1 and r2 here to formulate third http call const r3 = await callhttp(url3, data3); // 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 });

Estoy usando la biblioteca bluebird y necesito hacer una serie de solicitudes HTTP y necesito algunos de los datos de respuesta a la próxima solicitud HTTP. He creado una función que maneja mis solicitudes llamada callhttp() . Esto toma una url y el cuerpo de una POST.

Lo llamo así:

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 primera solicitud obtiene una clave API que debe pasarse a la segunda solicitud y así sucesivamente. ¿Cómo obtengo los datos de respuesta de la primera solicitud?

ACTUALIZAR

Esta es la función 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 ); } }); }