代码之家  ›  专栏  ›  技术社区  ›  hsz

在导出之前,使用额外的中间件动态包装命名的导出

  •  0
  • hsz  · 技术社区  · 7 年前

    我有一些从ES6模块导出的函数,如:

    export const funA = params => 'hello funA';
    export const funB = params => 'hello funB';
    

    我想在导出之前包装它们:

    const wrapper = params => fun => {
      // some extra logic
      Object.assign(params, { extra: 'data' });
      return fun(params);
    };
    
    export const funA = wrapper(params => 'hello funA');
    export const funB = wrapper(params => 'hello funB');
    

    它是这样工作的,但我想知道是否可以定义 funA funB 没有 wrapper 调用方式类似于:

    import { mapValues } from 'lodash';
    
    const wrapper = params => fun => {
      // some extra logic
      Object.assign(params, { extra: 'data' });
      return fun(params);
    };
    
    const funA = params => 'hello funA';
    const funB = params => 'hello funB';
    
    export default mapValues({ funA, funB }, wrapper);
    

    上面代码段的问题是没有使用命名的导出。

    我是否可以实现命名导出并可能将其包装为

    2 回复  |  直到 7 年前
        1
  •  0
  •   Benny Powers    7 年前

    您将在哪里确定哪个包装中间件?

    你可以做些像

    export const funA = middleware => params => 'funA'
    export const funB = middleware => params => 'funB'
    

    import { funA } from './module.js'
    
    const funFunA = middleware(funA)
    

    但这听起来越来越像是函数组合的例子:

    import { funA } from './module.js'
    import { nextFun } from './other.js'
    
    const funFunA = compose(nextFun, funA)
    

    Arrow 单子

    https://evilsoft.github.io/crocks/docs/crocks/Arrow.html

    编辑:

    const _funA = a => b
    
    export const funA = (...args) => {
      switch (currentMood) {
        case 'saucy': return sauce(_funA(...args))
        default: return _funA(...args)
    }
    
        2
  •  0
  •   barbsan Cibi    7 年前

    wrapper 在每一行中,可以使用分解结构赋值和命名导出。然而,这需要重复 { funA, funB, ..., funXYZ } .

    import { mapValues } from 'lodash';
    
    const wrapper = params => fun => {
        // some extra logic
        Object.assign(params, { extra: 'data' });
        return fun(params);
    };
    
    let funA = params => 'hello funA';
    let funB = params => 'hello funB';
    
    let { funA, funB } = mapValues({ funA, funB }, wrapper);
    
    export { funA, funB };