Tengo una variedad de API para consultar. Por ejemplo var urls = ['example.org?x=1', 'example.org?x=2,3']
¿Cómo puedo hacer que ReactJS espere a que todas las respuestas (que son JSON) regresen antes de responder a la ¿cliente?
Probé una modificación de la respuesta de @Shanoor de Promises con http.get node.js pero el resultado para el cliente está vacío ( ""
).
var http = require('http'); var urls = ['example.org', 'example2.org', '...']; var done = 0; var result = []; function callback(index, data) { result[index] = data; done++; if (done == urls.length) { result.forEach(console.log); //I tried using the resp object here to return result[] but the data seemed corrupt } } function processUrl(url, index) { var finalData = ''; http.get(url, function(response) { response.setEncoding('utf8'); response.on('data', function(data) { finalData += data; }); response.on('error', console.error); response.on('end', function() { callback(index, finalData); }) }); } app.get("/api/blah", (resp) => { urls.forEach(processUrl); //resp(result); this would result in an empty response }
Puedes usar Promise para hacer eso, debería ser algo como
function processUrl(url, index) { var finalData = ''; return new Promise((resolve, reject) => { http.get(url, function(response) { response.setEncoding('utf8'); response.on('data', function(data) { finalData += data; }); response.on('error', reject); response.on('end', function() { resolve(finalData); }) }); }) } app.get("/api/blah", (resp) => { Promise.all(urls.map(processUrl)).then(function(results) { console.log(results); }); }
Tenga en cuenta que no verifiqué si el código funciona, así que lea más sobre Promises y el método Promise.all()