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