Estoy tratando de entender cómo funcionan las promesas en JS jugando con swapi.dev . Me gustaría crear una cadena dinámica de promesas (sin usar async/await) pero no me da ningún resultado. En particular, la idea detrás es obtener todos los nombres de la persona dada (por ejemplo, Luke Skywalker) y volcarlos en la consola.
¿Alguien podría ayudarme? ¿Qué me estoy perdiendo?
Gracias por adelantado.
"use strict"; const request = require("request-promise"); const BASE_URL = "http://swapi.dev/api"; var currentPromise = Promise.resolve(); callApiPromise(`${BASE_URL}/people/1`).then((data) => { console.log("Getting vehicles' URLs"); const vehicles_URL = data["vehicles"]; console.log("Starting looping through URLs"); for (let i = 0; i < vehicles_URL.length; i++) { console.log(`i=${i}, vehicle_URL=${vehicles_URL[i]}`); currentPromise = currentPromise.then(function () { console.log(".. getting vehicle name"); return getVehicleName[vehicles_URL[i]]; }); } }); function getVehicleName(url) { callApiPromise(url).then((vehicle_data) => { var arrVehicleData = new Array(); arrVehicleData.push(vehicle_data); console.log(arrVehicleData.map((vehicle) => vehicle.name)); }); } function callApiPromise(url) { return new Promise((resolve, reject) => { callApi(url, (err, data) => { if (err) { reject(err); return; } resolve(data); }); }); } function callApi(url, callback) { request .get(url) .then((response) => { const json = JSON.parse(response); callback(null, json); }) .catch((err) => { callback(err, null); }); }Algunos asuntos:
return en getVehicleNamegetVehicleName[vehicles_URL[i]] (debe estar entre paréntesis)Promise.allarrVehicleData siempre tendrá un solo elemento. No hay razón para una matriz allí donde se usa. También está tomando el enfoque incorrecto al usar request.get . La función inferior convierte esa API de Promise-API a una API de devolución de llamada, solo para hacer lo contrario (de devolución de llamada a promesa) en la función justo encima de ella. Simplemente debe omitir la capa de devolución de llamada y atenerse a las promesas:
"use strict"; const request = require("request-promise"); const BASE_URL = "http://swapi.dev/api"; getJson(`${BASE_URL}/people/1`).then(data => { return Promise.all(data.vehicles.map(getVehicleName)); }).then(vehicleNames => { console.log(vehicleNames); // Continue here... }); function getVehicleName(url) { return getJson(url).then(vehicle => vehicle.name); } function getJson(url, callback) { return request.get(url).then(JSON.parse); } Finalmente, ya no debe usar request-promise ya que el módulo de solicitud, del cual depende request-promise, ha quedado obsoleto .
getVehicleName no devuelve una promesa. En su lugar, invoca una promesa de que para cuando se resuelva, el bucle for que lo invoca ya se eliminará de la pila de llamadas.
Este es un ejemplo de encadenamiento de promesas:
const promise = new Promise(resolve => resolve(1)) const promise1 = Promise.resolve(2) const methodReturnPromise = () => new Promise(resolve => resolve(3)) promise.then(firstPromiseData => { // do something with firstPromiseData console.log(firstPromiseData) return promise1 }).then(secondPromiseData => { // do something with secondPromiseData console.log(secondPromiseData) return methodReturnPromise() }).then(thirdPromiseData => { // do something with thirdPromiseData console.log(thirdPromiseData) })