我正在创建一个接口,我需要在大多数方法之前运行检查功能,一遍又一遍地重复代码似乎不太好。有什么方法可以在运行函数之前先运行函数吗?
我当前代码的示例
const uploadObject = async (object) => {
if (!ipfs) noProvider()
const buffer = objectToIpfsBuffer(object)
return ipfs.add(buffer)
}
const uploadString = async (string) => {
if (!ipfs) noProvider()
const buffer = stringToIpfsBuffer(string)
return ipfs.add(buffer)
}
const uploadBuffer = async (buffer) => {
if (!ipfs) noProvider()
return ipfs.add(buffer)
}
...
module.exports = {
uploadObject,
uploadString,
uploadBuffer,
...
}
我希望之前运行的函数是if (!ipfs) noProvider()
答案 0 :(得分:0)
我认为按您的方式进行处理没有问题;但是,“挂钩”属性访问器的另一种方法是使用Javascript Proxy。
Proxy对象用于定义基本操作的自定义行为(例如,属性查找,赋值,枚举,函数调用等)。
初始化代理时,您需要提供two function inputs:
target
:要与Proxy一起包装的目标对象(可以是任何类型的对象,包括本机数组,函数甚至其他代理)。handler
:一个对象,是一个占位符对象,其中包含traps用于代理。所有陷阱都是可选的。如果尚未定义陷阱,则默认行为是将操作转发给目标。这是一个例子:
const handler = {
get: function(target, prop, receiver) {
console.log('A value has been accessed');
return Reflect.get(...arguments);
}
}
const state = {
id: 1,
name: 'Foo Bar'
}
const proxiedState = new Proxy(state, handler);
console.log(proxiedState.name);
答案 1 :(得分:0)
您可以使用代理对象来拦截其他对象的内部操作。
var newObject = new Proxy(yourObject, {
get(target, prop, receiver){
if(['uploadObject', 'uploadString','uploadBuffer'].includes(prop) && type(target[prop]) == typeof(Function)) {
if (!ipfs) noProvider()
return Reflect.get(target, prop, receiver);
}
},
});
newObject.uploadObject();
答案 2 :(得分:0)
我可能会像您一样内联地执行此操作,但要在工具栏中添加另一个工具:您可以创建一个更高阶的函数,该函数接受一个函数并生成一个新函数来进行检查,然后执行工作。
const checkIpfs = fxn => {
return (...args) => {
if (!ipfs) noProvider();
return fxn(...args);
}
}
const uploadObject = checkIpfs(async (object) => {
const buffer = objectToIpfsBuffer(object)
return ipfs.add(buffer);
});
const uploadString = checkIpfs(async (string) => {
const buffer = stringToIpfsBuffer(string)
return ipfs.add(buffer)
})
const uploadBuffer = checkIpfs(async (buffer) => {
return ipfs.add(buffer)
})