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

时间:2018-09-18 10:39:53

标签: javascript node.js ecmascript-6 composition

我从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的情况下定义funBwrapper

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

以上代码段的问题是未使用命名的导出。

我是否可以实现使用wrapper中间件动态包装命名输出的可能性?

2 个答案:

答案 0 :(得分:0)

您要在哪里确定哪种包装中间件?

您可以做类似的事情

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 monad之类的东西也是值得的

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

答案 1 :(得分:0)

如果要避免在每一行中重复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 };