Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

134
Visualizações
Resolver una función Await si tarda más de x segundos en Javascript/Node.js

Tengo una función de espera () que espera una API externa. Por lo general, estas API tardan 600 ms en devolver datos. Pero a veces toma alrededor de 10 segundos. Entonces, ¿cómo escribo una función para que, si demora más de 1 segundo, rompa esa función y resuelva de todos modos (no espere la API)

Aquí está el código de la función principal que llama a la API.

 console.log("Before Await"); await fetchExternalAPI("data"); console.log("Continue if success or takes more than x seconds");

La función real:

 const fetch = require('node-fetch'); module.exports = async function fetchExternalAPI(data) { try { const response = await fetch("https://www.example.com/api/log", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(data) }); const returnData = await response.json(); console.log("Response: " + JSON.stringify(returnData)) return returnData } catch (e) { console.log("Error: " + e) return e } }

Quiero devolver el éxito de la función anterior.

  1. si buscar es un éxito
  2. o si se excede más de x segundos

Ambos deberían devolver el éxito sin importar el resultado real.

about 4 years ago · Juan Pablo Isaza
3 Respostas
Responde à pergunta

0

Puede usar AbortController para abort el método de recuperación, dentro de un setTimeout con 1 segundo, y si la fetch se resolvió antes de que se ejecute la devolución de llamada de setTimeout , entonces clearTimeout

 const fetch = require('node-fetch'); module.exports = async function fetchExternalAPI(data) { try { let controller = new AbortController(); let timeId = setTimeout(() => { controller.abort() }, 1000) const response = await fetch("https://www.example.com/api/log", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(data) signal: controller.signal }); clearTimeout(timeId) const returnData = await response.json(); console.log("Response: " + JSON.stringify(returnData)) return returnData } catch (e) { console.log("Error: " + e) return e } }

about 4 years ago · Juan Pablo Isaza Relatório

0

Creo que necesitas usar Axios.

 npm i axios

que en el cuerpo tiene un tiempo de espera de propiedad.

 const instance = await axios.create({ baseURL: 'https://some-domain.com/api/', timeout: 1000, headers: {'X-Custom-Header': 'foobar'} });
about 4 years ago · Juan Pablo Isaza Relatório

0

Puede agregar una promesa en su llamada para resolver a tiempo y rechazar si es demasiado larga. El siguiente código no ha sido probado pero esa es la idea

 const fetch = require('node-fetch'); module.exports = async function fetchExternalAPI(data) { try { const response = await fetch("https://www.example.com/api/log", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(data) }); await new Promise((resolve, reject) => { setTimeout(reject, 50000)); resolve(); }).then(() => { const returnData = await response.json(); console.log("Response: " + JSON.stringify(returnData)) return returnData }).catch(() => { return 'Took too long'; })); } catch (e) { console.log("Error: " + e) return e } }
about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda