Soy nuevo en la codificación y las promesas son algo así como un concepto abstracto para mí. Sé que para devolver una Promesa debes usar .then y .catch , pero no estoy seguro de cómo deben usarse exactamente en el siguiente código.
/** * Make an HTTPS request to the MTA GTFS API for a given feed. * @param {String} baseUrl - base URL for MTA GTFS API * @param {String} feedId - identifier for which realtime feed * @param {String} apiKey - key for MTA GTFS API * @return {<Object>} - Promise of parsed feed. */ function makeRequest(baseUrl, feedId, apiKey) { const feedUrl = baseUrl + feedId; return new Promise((resolve, reject) => { const req = https.request(feedUrl, { headers: { 'x-api-key': apiKey } }, (res) => { if (res.statusCode < 200 || res.statusCode >= 300) { return reject(new Error('statusCode=' + res.statusCode)); } var data; data = []; res.on('data', (chunk) => { return data.push(chunk); }); return res.on('end', function() { var msg; data = Buffer.concat(data); try { msg = nstrDecoder.decode(data); } catch (err) { try { console.log(err.message); msg = nsssDecoder.decode(data); } catch (err) { console.log(err.message); msg = ""; } } resolve(msg); }); } ); req.on('error', (e) => { reject(e.message); }); req.end(); }); } return console.log(makeRequest(baseUrl, feedId, apiKey));Después de ejecutar este código, aparece un mensaje que dice que la Promesa está pendiente. ¿¿Pensamientos??
Al llamar a una función que devuelve una promesa, obtendrá la promesa en un estado pendiente, ya que aún no se ha resuelto o rechazado. Tienes dos opciones.
Opcion uno. nodo 10+ puede usar async await.
async function main(){ const res = await makeRequest(baseUrl, feedId, apiKey) return res }Pre nodo 10
makeRequest(baseUrl, feedId, apiKey) .then(data => { console.log(data) }) .catch(err => { console.log(err) })Esencialmente, si tiene que esperar los datos, debe tener el código que se basa en esos datos después de esperar o en el bloque .then.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
Su función makeRequest() devuelve una promesa. Para usar esa promesa, usa .then() o await para obtener el valor resuelto de la promesa.
Usando .then() :
makeRequest(baseUrl, feedId, apiKey).then(result => { console.log(result); }).catch(err => { console.log(err); }); o usando await :
async function someFunction() { try { let result = await makeRequest(baseUrl, feedId, apiKey); console.log(result); } catch(e) { console.log(err); } } FYI, mucho de lo que makeRequest() se puede hacer de manera más simple usando una biblioteca de solicitud http que ya admite promesas. Hay una lista de bibliotecas competentes para elegir aquí .
Mi favorito es got() , pero puedes revisar la lista para decidir cuál te gusta. Las principales ventajas son que ya recopilan la respuesta completa para usted, ya admiten promesas, admiten una amplia variedad de esquemas de autenticación con lógica integrada y, a menudo, pueden decodificar o analizar la respuesta por usted, todo lo que https.request() . no sabe cómo hacerlo por sí mismo.