Soy nuevo en javascript y estoy leyendo sobre cierres actualmente. Estaba tratando de implementar un ejemplo para comprender mejor el concepto.
Este es el fragmento:
function getValue() { let a = 0 const runner = async () => { a += 1 } setInterval(runner, 100) return () => { return a } } let value = getValue() console.log(value()) -----> logging statement 1 // some long operation console.log(value()) -----> logging statement 2Sin embargo, la salida que veo es:
1 1 Esperaba que las dos declaraciones de registro generaran dos valores diferentes. Tengo entendido que una vez que se llama a getValue() , la runner de ejecución se ejecutaría a intervalos regulares. La variable a se actualizaría y, por lo tanto, el segundo console.log debería haber impreso un valor incrementado de a .
Estás casi allí, excepto que te perdiste la parte principal.
Las operaciones están ocurriendo demasiado rápido. No se necesitan 100 milisegundos para ejecutar la segunda iteración, por lo que el valor sigue siendo el mismo.
Intente esperar al menos 100 milisegundos ya que el intervalo que tiene necesita esa cantidad de tiempo para incrementarse.
Como se muestra en el siguiente ejemplo.
function getValue() { let a = 0 const runner = async () => { a += 1 } setInterval(runner, 100) return () => { return a } } let value = getValue() console.log(value()) // operations are happening too fast setTimeout(() => console.log(value()), 100); setTimeout(() => console.log(value()), 200); setTimeout(() => console.log(value()), 300);function getValue() { let a = 0 const runner = () => { a += 1 console.log("Runner's A: " +a) } setInterval(runner, 100) return () => { return a } } let value = getValue() console.log(value());// -----> logging statement 1 // some long operation console.log(value());// -----> logging statement 2https://jsbin.com/geponejuba/edit?js,consola,salida
como se señaló anteriormente, js tiene un solo subproceso, por lo que la forma en que funciona es que sus declaraciones de registro se ejecutan primero y, si no hay nada más que hacer, se ejecutan setTimeout/setInterval (esta es una declaración extremadamente simplificada, puede leer sobre "Bucle de eventos" para una versión detallada)
en el ejemplo jsbin que compartí, puede ver que se llama a setInterval y, de hecho, está actualizando el valor.