Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

172
Vistas
Uso de ES6 Proxy para cargar recursos de forma perezosa

Estoy creando algo así como una clase ActiveRecord para documentos almacenados en MongoDB (similar a Mongoose). Tengo dos objetivos:

  1. Intercepte todos los establecedores de propiedades en un documento mediante un proxy y cree automáticamente una consulta de actualización para enviarla a Mongo. Ya encontré una solución para este problema en SO.

  2. Evite lecturas innecesarias de la base de datos. Es decir, si se realiza una función en un documento, y esa función solo establece propiedades y nunca usa una propiedad existente del documento, entonces no necesito leer el documento de la base de datos, puedo actualizarlo directamente . Sin embargo, si la función usa alguna de las propiedades del documento, primero tendría que leerlo de la base de datos y luego continuar con el código. Ejemplo:

     // Don't load the document yet, wait for a property 'read'. const order = new Order({ id: '123abc' }); // Set property. order.destination = 'USA'; // No property 'read', Order class can just directly send a update query to Mongo ({ $set: { destination: 'USA' } }). await order.save();
     // Don't load the document yet, wait for a property 'read'. const order = new Order({ id: '123abc' }); // Read 'weight' from the order object/document and then set 'shipmentCost'. // Now that a 'get' operation is performed, Proxy needs to step in and load the document '123abc' from Mongo. // 'weight' will be read from the newly-loaded document. order.shipmentCost = order.weight * 4.5; await order.save();

¿Cómo haría esto? Parece bastante trivial: establecer una trampa 'get' en el objeto del documento. Si es la primera propiedad 'obtener', cargue el documento desde Mongo y guárdelo en caché. Pero, ¿cómo encajo una operación asíncrona en un getter?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

la aritmética no puede ser asíncrona

Probablemente pueda iniciar una lectura asíncrona desde dentro de un captador (no lo he probado, pero parece legítimo), pero el captador no puede esperar el resultado. Por lo tanto, a menos que su biblioteca de base de datos proporcione algunas llamadas de acceso de bloqueo , esta línea, donde order.weight se recupera justo a tiempo y el valor se usa en la multiplicación, siempre será pura fantasía en cualquier régimen de lectura diferida:

 order.shipmentCost = order.weight * 4.5

(Si su biblioteca de base de datos tiene lecturas de bloqueo, creo que será sencillo crear lo que desea utilizando solo lecturas de bloqueo. Pruébelo. Creo que esto es parte de lo que hace el cargador de datos de Sequelize).

No hay forma de que la multiplicación opere en Promises. No hay forma de esperar un valor asíncrono que no sea asíncrono en sí mismo. Incluso los eventos, que no son estrictamente asincrónicos/en espera, requerirían alguna fachada asincrónica o un patrón de devolución de llamada, ninguno de los cuales bloquea y, por lo tanto, ninguno de los dos podría hacer que esa declaración funcione.

Esto podría funcionar, pero obliga a todas las personas que llaman a administrar la carga diferida:

 order.shipmentCost = (await order.weight) * 4.5

Ese enfoque deformará todo su ecosistema. Sería mucho mejor para las personas que llaman simplemente invocar read y save cuando sea necesario.

O podría crear un generador que funcione dentro de captadores, pero aún necesitaría "preparar la bomba" explícitamente para el primer acceso de cada propiedad, lo que haría que la declaración de "fantasía" funcionara a costa de generar un horrible pre -instrucción que await s en su lugar. Una vez más, es mejor usar read y save .


Creo que lo que espera es imposible dentro de javascript, porque el comportamiento de bloqueo y no bloqueo no es transparente y no se puede hacer que lo sea. Cualquier mecanismo asíncrono finalmente se manifestará como no escalar.

Tendría que crear su propio precompilador, como JSX, que podría transformar el código de fantasía en basura asincrónica/consciente.


Un consejo serio: use una biblioteca de persistencia lista para usar en lugar de hacer crecer la suya propia .

  1. El espacio problemático de la persistencia de datos está lleno de muchos problemas muy difíciles y casos extremos. Tendrás que resolver más de ellos de lo que piensas.
  2. A menos que todo su proyecto sea "crear una mejor tecnología de persistencia", no va a construir algo mejor que lo que existe, lo que significa que construir uno propio es solo la forma más lenta de obtener una solución inferior.
  3. Más código que escribes es más errores para corregir. (Y estás escribiendo pruebas para esta biblioteca de persistencia mágica, ¿verdad?)

Si está tratando de crear una aplicación real y solo necesita interactuar con Mongo, dedique 15 minutos a comprar en npm y continúe. La vida es demasiado corta. A nadie le importará cuán "genial" es su capa de base de datos manual que es casi como ActiveRecord (excepto por algunas personalizaciones y errores obstinados y características faltantes, todo lo cual actuará como una barrera para otros e incluso para usted).

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda