在对象中的每个函数之前调用函数的最佳方法?

时间:2018-09-17 01:01:50

标签: javascript

我正在创建一个接口,我需要在大多数方法之前运行检查功能,一遍又一遍地重复代码似乎不太好。有什么方法可以在运行函数之前先运行函数吗?

我当前代码的示例

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()

3 个答案:

答案 0 :(得分:0)

我认为按您的方式进行处理没有问题;但是,“挂钩”属性访问器的另一种方法是使用Javascript Proxy

  

Proxy对象用于定义基本操作的自定义行为(例如,属性查找,赋值,枚举,函数调用等)。

初始化代理时,您需要提供two function inputs

  1. target:要与Proxy一起包装的目标对象(可以是任何类型的对象,包括本机数组,函数甚至其他代理)。
  2. 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)
})