Tengo una tienda remota de clave/valor con una interfaz simple .get()/.put() . Quiero llamar a someProxyObject.route1.route2.route3 y hacer que esto se resuelva en una llamada a storageObject.retrieve(["route1", "route2", "route3"]) . El objetivo es tratar el almacenamiento remoto como un objeto local. Actualmente estoy usando el siguiente código para recopilar la ruta.
var validator = { route: [], get(target, key) { this.route.push(key) console.log(String(this.route), "get"); return new Proxy(target, validator) }, set (target, key, value) { this.route.push(key) console.log(String(this.route), "set"); return false }, deleteProperty (target, key) { this.route.push(key) console.log(String(this.route), "delete"); return target; } } let storage = new Proxy({}, validator); storage.p1.p2.p3.p4 = 1 validator.route = [] storage.p1.p2.p3.p4 Como puede ver al ejecutar el código anterior, cuando configuro o elimino un valor, hay una recurrencia de llamadas de get y luego una llamada de delete/set de resolución. El problema es no tener una llamada de resolución para una cadena de get simple. ¿Puede idear un método para actuar sobre el .routeX final para permitir una resolución final? EDITAR: Mi objetivo es evitar colocar una llamada final como .resolve al final de la cadena
Sé que esto no responde a su pregunta, pero podría agregar una .route adicional para resolver la cadena. Ni siquiera necesitas un setter:
function createStorage() { const route = []; function createProxy() { return new Proxy({}, { get(_0, key) { if (key === 'route') { return route; } route.push(key); return createProxy(); } }); } return createProxy(); } const storage = createStorage(); console.log(storage.p1.p2.p3.route); //=> ['p1', 'p2', 'p3'] De la misma manera, también podría tener una clave clear que restablecerá la matriz de rutas para que no acceda al estado directamente.