working sirve react que para not mdn loop cleartimeout javascript recursion settimeout

javascript - sirve - settimeout react



¿Una llamada a la función ''setTimeout'' recursiva acabará por matar al motor JS? (1)

Digamos que tengo algunos datos que necesito obtener del servidor cada 10 segundos. Tendría una función que obtiene los datos a través de AJAX y luego llama a setTimeout para llamar de nuevo a esta función:

function GetData(){ $.ajax({ url: "data.json", dataType: "json", success: function(data){ // do somthing with the data setTimeout(GetData, 10000); }, error: function(){ setTimeout(GetData, 10000); } }); }

Si alguien deja la página web abierta todo el día, podría recibir miles de llamadas a funciones recursivas.

No quiero usar setInterval porque eso no tiene en cuenta el retraso de la red. Si la red está ocupada y toma 15 segundos procesar la solicitud, no quiero volver a preguntar antes de obtener el tiempo de espera de AJAX.

¿Cuál es la mejor manera de manejar una función que necesita ser llamada periódicamente?


No hay recursión real porque la llamada a GetData se retrasa y el contexto de JavaScript se destruye mientras tanto. Por lo tanto, no bloqueará el motor JS.

Para su muestra de código, esto es básicamente lo que sucederá en el nivel del motor JS:

  1. Inicializar el motor JS
  2. Crear el contexto de la función GetData
  3. Ejecute declaraciones GetData que incluyen "setTimeOut"
  4. "setTimeOut" instruye al motor JS para llamar a una función en 10 segundos
  5. Destruye el contexto de la función GetData
  6. En este punto, en términos de uso de la memoria, volvemos al paso 1. La única diferencia es que el motor JS almacenó una referencia a una función y cuándo llamarla (vamos a llamar a estos datos "futureCall").
  7. Después de 10 segundos, repita desde el paso 2. "futureCall" se destruye.