Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

398
Views
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 answers
Answer question

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!