Lo estoy usando en muchos lugares de mi código y funciona. pero en un lugar no dio ningún error, tampoco me dio el resultado deseado. y cuando muestro mi código en el foro de soporte, sugieren que "Estás usando el objeto/clase JS "Promise" incorrectamente".
¿Alguien puede guiarme sobre lo que está mal con mi código? Aquí está mi ejemplo de código:
let charity = {}; await Promise.all( charity = charityData.map(function( data ) { let address = data.zipCode let url = "https://maps.googleapis.com/maps/api/geocode/json?&address="+`'${address}'`+"&key=***Google geocoding Key***"; //client's Key let urlResponse = Backendless.Request.get(url) // let latitude = urlResponse.results[0].geometry.location.lat; // let longitude = urlResponse.results[0].geometry.location.lng; //let updateCharitiesData = {'objectId': data.objectId, 'latitude':latitude, 'longitude':longitude}; return urlResponse; }) ); return charity;Casi. Suponiendo que Backendless.Request.[método] devuelve una promesa, sería más correcto hacer algo como:
async function getCharityData() { const charity = await Promise.all(charityData.map( async function(data) { const address = data.zipCode; const url = `https://maps.googleapis.com/maps/api/geocode/json?&address=${address}&key=***Google geocoding Key***`; //client's Key const urlResponse = await Backendless.Request.get(url); return urlResponse; })); return charity }Promise.all requiere una matriz como argumento para funcionar correctamente; pasar un Array.map aquí y asignar el valor devuelto a la caridad asegura que su Promise.all se ejecute como se esperaba y que la matriz devuelta sea una matriz de promesas resueltas.
Yo lo haría así:
function getCharityData() { // `charity` is an array of Promises that will each resolve to // a response. const charity = charityData.map((data) => { let address = data.zipCode; let url = 'https://maps.googleapis.com/maps/api/geocode' let urlResponse = Backendless.Request.get(url); return urlResponse; }); return Promise.all(charity); } try { const charityData = await getCharityData(); } catch (e) { console.error(e); } De esta forma, los datos de charityData serán una matriz de respuestas obtenidas.
En su código, el resultado de Promise.all() nunca se asigna a la charity antes de devolverlo, y ese es el valor que desea.
Si tiene acceso a Async/Await, simplemente haría lo siguiente:
function getCharityData(charityData) { let results = []; for (let i = 0; i < charityData.length; i++) { let url = `https://maps.googleapis.com/maps/api/geocode/json?&address=${charityData[i].zipCode}&key=***Google geocoding Key***`; try { let result = await Backendless.Request.get(url); results.push(result); } catch (err) { console.log("Oh dear!"); } } return results;}
Para su caso de uso, no hay necesidad de usar ninguna biblioteca de Promise cuando tiene Async/Await, bien pasado de moda para bucles y espera (personalmente preferiría hacer este tipo de llamada secuencialmente en lugar de en paralelo como Promise.all implora cuando Estoy consultando API externas. Esto también asegura que no fallemos tan rápido como lo hace Promise.all).