javascript - JS TS-dekorator för att villkorligt förhindra metodkörning
Jag skulle vilja skriva en metoddekorerare som villkorsmässigt förhindrar körningen av metoden eller ersätter metoden med någon annan procedur. Särskilt vill jag ha olika beteende beroende på om den anropas på klienten eller på servern:
function serverMethod(target) {
if(Meteor.isClient) {
// call server method to delete a user
// prevent execution of decorated method
}
}
class User {
@serverMethod
delete() {
UserCollection.delete(this.id)
}
}
Svar #1
1. Begreppsmässig översikt
ES2016-metoddekorerare är funktioner som har 3 parametrar:
target— antingen prototypen av klassen (om metoden som dekoreras är en instansmetod) eller konstruktorn för klassen (om metoden som dekoreras är statisk).name— namnet på metoden som dekoreras.descriptor— [deskriptorobjektet][1] för metoden som dekoreras.
En dekoratör kan dekorera (eller förbättra) en metod genom att omsluta den befintliga metoden med en ny funktion som gör mer (eller färre) saker än den ursprungliga funktionen.
2. Fixa/Förbättra frågans kod
Med detta i åtanke bör serverMethod omsluta descriptor.value (som innehåller metoden som vi vill dekorera) runt en ny funktion som kontrollerar om vi är på klienten eller servern:
function serverMethod(
target: any,
name: string,
descriptor: PropertyDescriptor
) {
const method = descriptor.value; // references the method being decorated
descriptor.value = function (...args) {
if (Meteor.isClient) return; // exit the function
// This part will run when Meteor.isClient == false
method.apply(this, args);
};
}
class User {
@serverMethod
delete() {
UserCollection.delete(this.id);
}
}
Det är viktigt att inte glömma ...args, så att de argument som skickas till dina metoder också kommer att användas av den dekorerade metoden via method.apply.
3. Vidare läsning
- JS Dekoratördesign
- JS-specifikationsförslag
- Metoddekorerare i TS
