Estoy buscando una forma de llamar a un método "implícitamente" después de una cadena (patrón de interfaz fluida).
ya tengo algo asi
class Foobar { methodA() { // update state return this; } methodB() { // update state return this; } applyChanges() { // persist the state at this point } }Y sobre el uso:
new Foobar().methodA().methodB().applyChanges(); La cuestión aquí es que no sé de antemano si los usuarios de la clase usarán solo uno o dos métodos de cadena (o incluso cero) y para la "experiencia del desarrollador", no quería exponer el método applyChanges .
¿Hay alguna manera de realizar eso? O incluso otro patrón que podría implementar. Por ejemplo, pensé que podría apilar las llamadas al método primero, pero aún no sabré cuándo detenerme y ejecutar el método applyChanges :(
Si la operación applyChanges fuera async (y supongo que la "persistencia" podría necesitar algo asíncrono de todos modos), sería fácil: podría tener un método then como este:
async applyChanges () { /*...*/ } then (success, failure) { return this.applyChanges().then(success, failure) } Luego, await su objeto implícitamente aplicaría cambios y esperaría a que se hicieran ( await new Foobar().methodA().methodB() ), porque async / await usa promesas bajo el capó, por lo que await await x causará x.then para ser llamado si existe. Así es como se comportan los objetos de consulta de Mongoose, por ejemplo.
Ok, en realidad me salí con la mía gracias a Polly. Debido a que evalúa perezosamente el controlador http que estoy construyendo, obtiene la "versión correcta" cuando ocurren las solicitudes HTTP :)