在导出之前使用额外的中间件动态包装命名导出
Dynamically wrap named exports with extra middleware before exporting
我有一些从 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');
它是这样工作的,但我想知道是否可以在不调用 wrapper
的情况下定义 funA
和 funB
,类似于:
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
中间件动态包装它们?
你打算在哪里确定哪个包装器中间件?
你可以这样做
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)
}
如果你想避免在每一行中重复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 };
我有一些从 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');
它是这样工作的,但我想知道是否可以在不调用 wrapper
的情况下定义 funA
和 funB
,类似于:
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
中间件动态包装它们?
你打算在哪里确定哪个包装器中间件?
你可以这样做
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)
}
如果你想避免在每一行中重复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 };