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.

La devolución de llamada del FinalizationRegistry no se ha llamado.

Estoy tratando de entender FinalizationRegistry en JavaScript. Según la documentación de MDN, la función de devolución de llamada de FinalizationRegistry se llamará tan pronto como se pierda el objeto al que hace referencia débilmente. Intenté con un ejemplo simple pero parece que no funciona.

const obj = {a:'GC';}
registry = new FinalizationRegistry(value => {
  console.log(value);
});
registry.register(obj, "Garbage collected");
delete obj; // elimina obj del contexto global, pero no se llama la devolución de llamada del registro FinalizationRegistry

¿Alguien puede proporcionar un ejemplo sencillo que funcione?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Aquí tienes un ejemplo sencillo que demuestra cómo funciona FinalizationRegistry en JavaScript:

    // Creamos un objeto y una FinalizationRegistry
    const obj = {a: 'GC'};
    const registry = new FinalizationRegistry(value => {
      console.log(value);
    });
    
    // Registramos el objeto en el registro
    registry.register(obj, 'Recolectado basura');
    
    // Eliminamos todas las referencias al objeto
    obj.foo = 'bar';
    obj = null;
    
    // Esperamos a que se realice la recolección de basura
    // (normalmente se hace automáticamente por el motor de JavaScript)
    // Luego, comprobamos la consola para ver la salida de la devolución de llamada de FinalizationRegistry
    

    En este ejemplo, creamos un objeto obj con una única propiedad a. También creamos una FinalizationRegistry registry con una función de devolución de llamada que registra el valor del parámetro value en la consola.

    Luego, registramos obj en registry, junto con una cadena 'Recolectado basura' como argumento de la devolución de llamada.

    A continuación, eliminamos todas las referencias a obj (añadiendo una nueva propiedad foo y luego estableciendo obj como null), lo que debería desencadenar la recolección de basura de obj.

    Por último, esperamos a que se realice la recolección de basura (normalmente se hace automáticamente por el motor de JavaScript) y luego comprobamos la consola para ver la salida de la devolución de llamada de FinalizationRegistry.

    Si todo funciona correctamente, la devolución de llamada debería ser llamada con el valor 'Recolectado basura' cuando obj sea recolectado como basura.

    Ten en cuenta que el momento exacto de la recolección de basura en JavaScript depende de la implementación y, por lo tanto, no está garantizado. Como resultado, a veces puede ser difícil probar el comportamiento de finalización de manera controlada.

Comments are closed.