【问题标题】:JS TS decorator to conditionally prevent method executionJS TS 装饰器有条件地阻止方法执行
【发布时间】:2018-05-17 04:14:53
【问题描述】:
我想编写一个方法装饰器,有条件地阻止执行该方法或用其他过程替换该方法。特别是我希望根据何时在客户端或服务器上调用不同的行为:
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)
}
}
【问题讨论】:
标签:
javascript
typescript
decorator
【解决方案1】:
1。概念概述
ES2016 方法装饰器是具有 3 个参数的函数:
-
target — 类的原型(如果被修饰的方法是实例方法)或类的构造函数(如果被修饰的方法是static) .
-
name — 被装饰的方法的名称。
-
descriptor — 被修饰的方法的 [descriptor object][1]。
装饰器可以装饰(或增强)一个方法,方法是将现有方法包装在一个新函数周围,该新函数比原来的函数做更多(或更少)的事情。
2。修复/改进问题代码
考虑到这一点,serverMethod 应该将descriptor.value(其中包含我们要装饰的方法)包装在一个新函数周围,以检查我们是在客户端还是服务器中:
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);
}
}
重要的是不要忘记...args,以便通过method.apply 传递给您的方法的参数也将被装饰方法使用。
3。进一步阅读