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

Relaterade artiklar