Skip to content

Latest commit

 

History

History
43 lines (37 loc) · 1.73 KB

Decorator.md

File metadata and controls

43 lines (37 loc) · 1.73 KB

装饰器是一个很好用的特性,之前写 PY 的时候也常用到,但是没有深入的了解过在 python 中装饰器的原理是啥,后来在写 bd 的时候,有很多的 try catch 公共的代码就像是下面这样的,后来用装饰器搞了一把,发现还是挺好的,能节省挺多的代码的,看起来也很清爽,在装饰器里还可以搞一些公共的方法,也是很不错的。

function catchAPIError(target, key, descriptor) {
  return Object.assign({}, descriptor, {
    value: async function (...arg) {
      try {
        return await descriptor.value.apply(this, arg);
      } catch (e) {
        console.info(
          "HTTP Error: " + (e.msg || e || "No clear error information.")
        );
        if (process.env.NODE_ENV === "test") {
          console.info(descriptor.value);
        }
      }
    },
  });
}

class http {
  someRequest() {
    try {
      return http.request(url);
    } catch (error) {
      // some error happed
      console.log(error);
    }
  }

  @catchAPIError
  someRequestWithDecorator() {
    return http.request(url);
  }
  // 一行顶四行有木有 哈哈哈
}

同样的也可以把 redux 写成装饰器,也很好用,看着很简洁很清爽

es6 装饰器这部分的知识点我基本是看的这个文章 es6 装饰器

装饰器不能装饰函数,因为有作用域提升的问题,这一点我就想起当时看到 react hook 的时候,那就是函数是没有状态的,而 hook 的出现,让函数有了状态,这个就是一件很神奇的事情。当然如果一定要装饰函数,也不是不可以,那就变成了高阶函数去套函数了。