Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

406
Vistas
Cómo usar await y async durante las llamadas a la API de axios
const axios = require('axios'); const getShipmentDetails = ((nextCall) => { const res = axios({ method: 'post', url: nextCall, headers:{ Authorization: "<Generated Bearer Token>"}, data:{ "filter" : { "type" : "postDispatch", "states" : ["SHIPPED"], "orderDate" : { "from" : "2022-04-01", "to" : "2022-04-04" } } } }) if(res['data']['hasMore'] == false ){ return res['data']['shipments'].concat(getShipmentDetails(res['data']['nextPageUrl'])) } else{return res['data']['shipments']} }); const result = getShipmentDetails("https://api.flipkart.net/sellers/v3/shipments/filter/"); console.log(result);

Estoy obteniendo datos recursivamente de la API paginada. Recibo varios errores al agregar funciones de espera/async en este código. Debido a la demora de la salida de las llamadas a la API, se está imprimiendo "Indefinido". Actualice este código con await/async o cualquier método adecuado para que los datos de todas las páginas se concatenen.

about 4 years ago · Juan Pablo Isaza
3 Respuestas
Responde la pregunta

0

const axios = require('axios') const getShipmentDetails = async ((url) => { const res = await axios({ method: 'post', url: url, headers: { Authorization: "<Generated Bearer Token>"}, data: { "filter" : { "type" : "postDispatch", "states" : ["SHIPPED"], "orderDate" : { "from" : "2022-04-01", "to" : "2022-04-04" } } } }) if (res['data']['hasMore'] == true) { const more = await getShipmentDetails(res['data']['nextPageUrl']) return res['data']['shipments'].concat(more); } else { return res['data']['shipments'] } }) getShipmentDetails("https://api.flipkart.net/sellers/v3/shipments/filter/") .then(result => console.log(result))

Deberías hacer lo que quieras. Asumí que obtuviste tu hasMore condicional al revés ya que, lógicamente, esperarías que hasMore fuera verdadero si hubiera páginas adicionales.

Una nota sobre async/await y promesas:

Si usa promesas, debe usar promesas hasta el final. Javascript no ofrece un mecanismo para bloquear una promesa. Entonces, si tiene un código asíncrono, sus únicas opciones son .then y async/await, que es azúcar sintáctico para .then . Esto es diferente de cómo funcionan Promises (o el equivalente) en muchos otros lenguajes, incluidos C# y Java.

Finalmente, algunas cosas de estilo: el estilo convencional de Javascript siempre pone un espacio entre if y los paréntesis alrededor de la expresión condicional y un espacio entre la expresión condicional y el inicio del bloque. También es una convención poner un espacio entre una clave de objeto y su valor. Y aunque tanto el punto y coma como el no punto y coma son convenciones comunes, debe ser coherente y usar punto y coma en todas partes o en ninguna.

about 4 years ago · Juan Pablo Isaza Denunciar

0

Tal vez un enfoque más simple sería usar el ciclo do-while, algo como esto:

 const axios = require('axios'); const callShipmentDetails = async (nextCall) => { const res = await axios({...}) return res } const getShipmentDetails = (async (url = "https://api.flipkart.net/sellers/v3/shipments/filter/") => { var hasMore = false // var times = 0 do { var response = await callShipmentDetails(url) hasMore = response.data.hasMore url = url.concat(response.data.nextPageUrl) /* this code is for breaking after 100 times if this becomes endless loop */ // ++times // if (times > 100) break; } while (hasMore) });
about 4 years ago · Juan Pablo Isaza Denunciar

0

De acuerdo con los documentos de axios , el método axios devuelve una promesa, por lo que todo lo que tiene que hacer es agregar algunas declaraciones async/await en los lugares apropiados: async en la función getShipmentDetails , y await cuando se llama, y await en axios .

 const axios = require('axios'); const SHIPMENT_AXIOS_CONFIG = { // Pulled this out for readability method: 'post', headers: { Authorization: '<Generated Bearer Token>'}, data: { filter: { type: 'postDispatch', states: ['SHIPPED'], orderDate: { from: '2022-04-01', to: '2022-04-04', } } } }; const getShipmentDetails = async (nextCall) => { const res = await axios({ // Wait for the response ...SHIPMENT_AXIOS_CONFIG, url: nextCall, }); const { data } = res; // destructuring to get common properties makes the code more readable if (data.hasMore == false) { // Should this be hasMore === true? // Wait for the additional details const shipments = await getShipmentDetails(data.nextPageUrl); return data.shipments.concat(shipments); } return data.shipments; }; const result = await getShipmentDetails('https://api.flipkart.net/sellers/v3/shipments/filter/');
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda