我从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);
以上代码段的问题是未使用命名的导出。
我是否可以实现使用wrapper
中间件动态包装命名输出的可能性?
答案 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 };