es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo detener la solicitud de recuperación de datos utilizando un tiempo de espera en la solicitud fetch mientras se añaden intervalos.

Estoy realizando una encuesta para mi informe, agregando un intervalo de 5 segundos entre cada solicitud.

const addDelay = timeout => new Promise(resolve => setTimeout(resolve, timeout))

export const miInforme = () => async (dispatch) => {
  dispatch({
    type: constants.SOLICITUD_DESCARGA_INFORME
  })

  let url = `/admin/dashboard/report.js?project_id=${projectId}&tool_id=${toolId}`

  try {
    const suscribirse = async (uri) => {
      let response = await fetch(uri, {
        method: 'GET&# 39;,
        headers: {
          'content-type': 'application/json',
          'x-api-token': `Bearer ${token}`
        }
      })
      const resBody = await response.json()
      if (resBody.status === 'éxito') {
        window.location.href = resBody.url
        dispatch({
          type: constants.DESCARGA_INFORME_EXITO
        })
      } else {
        await addDelay(5000)
        await suscribirse(url)
        //   return;
        // setTimeout(() => {
        //   dispatch({
        //     type: constants.SHOW_DOWNLOAD_POPUP
        //   })
        //   return;
        // }, 15000);
      }
    }
    suscribirse(url)
  } catch (error) {
    dispatch({
      type: constants.DESCARGA_INFORME_ERROR,
      errorMessage: error.status
    })
  }
}

Ahora, aquí quiero detener la encuesta después de 15 segundos y mostrar una ventana emergente.

El problema es que no puedo agregar setTimeout aquí porque estoy usando async. Además, no deja de llamar al método subscribe una y otra vez, ya que sigue entrando en la parte del else, return no funciona.

Quiero salir de la parte del else, dejar de llamar a la función y mostrar una ventana emergente después de que hayan transcurrido 15 segundos. ¿Cómo puedo lograr esto?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para lograr esto, puedes utilizar una variable local para llevar un registro del tiempo total transcurrido y salir de la recursión si excede los 15 segundos. Así es como puedes modificar tu código:

    export const myReport = () => async (dispatch) => {
      dispatch({
        type: constants.DOWNLOAD_REPORT_REQUEST
      })
    
      let url = `/admin/dashboard/report.js?project_id=${projectId}&tool_id=${toolId}`
      let totalTime = 0 // Agregar esta variable para llevar un registro del tiempo transcurrido
    
      try {
        const subscribe = async (uri) => {
          let response = await fetch(uri, {
            method: 'GET',
            headers: {
              'content-type': 'application/json',
              'x-api-token': `Bearer ${token}`
            }
          })
          const resBody = await response.json()
          if (resBody.status === 'success') {
            window.location.href = resBody.url
            dispatch({
              type: constants.DOWNLOAD_REPORT_SUCCESS
            })
          } else {
            await addDelay(5000)
            totalTime += 5000 // Agregar tiempo transcurrido
            if (totalTime >= 15000) {
              dispatch({
                type: constants.SHOW_DOWNLOAD_POPUP
              })
              return // Salir de la recursión si el tiempo excede los 15 segundos
            }
            await subscribe(url)
          }
        }
        subscribe(url)
      } catch (error) {
        dispatch({
          type: constants.DOWNLOAD_REPORT_FAILURE,
          errorMessage: error.status
        })
      }
    }
    

    Esto debería resolver tu problema permitiéndote detener el sondeo después de 15 segundos y mostrar un popup.

Comments are closed.