Estoy tratando de obtener los datos de facturación de la API de Twilio y guardar el valor devuelto en una variable para poder devolverlo y mostrarlo en mi aplicación web. Sé que está relacionado con async, intenté usar async y await pero no pude hacerlo funcionar.
const twilio = require("twilio"); client = twilio( "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "AUTHXXXXXXXXXXXXXXXXXXXXXXXXXXX" ); const filterOpts = { startDate: "2021-08-01", endDate: "2021-08-31", }; let result = [] function getBillingData() { client.usage.records.each(filterOpts, async (record) => { let temp = await record; result.push(temp); }); } getBillingData(); console.log(result.length); Cuando intento ejecutar esto, imprime 0
const filterOpts = { startDate: "2021-08-02", endDate: "2021-08-02", callback: (data) => {result.push(data);} , done: () => {console.log(result.length);}, }; async function getBillingData() { client.usage.records.each(filterOpts); } async function getData() { await getBillingData(); }; getData();Revisé la documentación para encontrar que puedo pasar dos parámetros opcionales que harían mi trabajo.
Desarrollador evangelista de Twilio aquí.
Creo que este problema es una condición de carrera con llamadas asíncronas en su JS y su código regresa antes de que finalicen las llamadas asíncronas. Creo que each llamada también es asíncrona. Prueba esto:
async function getBillingData() { let result = [] await client.usage.records.each(filterOpts, async (record) => { let temp = await record; result.push(temp); }); return result; } getBillingData().then((result) => { console.log(result.length); }) Ahora, la función getBillingData es una función async , por lo que puede usar await en la llamada a client.usage.records.each . También recopila los results dentro de sí mismo y devuelve el valor cuando la función se resuelve.
Finalmente, usamos getBillingData().then() para garantizar que los datos se recopilen y se devuelvan antes de registrarlos.