这个问题的标题可能具有误导性。我很难理解这个概念。我想将所有参数传递到一个函数中,但稍后使用这些参数调用它。
我目前正在做这样的事情:
function copyRecords(userId, options) {
const getRecordsWrapper = (userId, options) => () => getRecords(userId, options);
abstractionService = new MyAbstractionService(getRecordsWrapper);
...etc
}
这是我保存并稍后调用函数的地方:
class MyAbstractionService {
constructor(getRecords) {
this.getRecords = getRecords;
}
performSomeAction() {
return this.getRecords();
}
}
我需要这样做,因为getRecords
在不同的领域采用不同的参数,我想将它们抽象到一个服务中,而不必将一堆参数传递到服务中。这会变得混乱,因为我也需要为其他一些功能执行此操作。
我的想法正确吗?除了让一个函数返回另一个返回我的函数的函数之外,还有其他方法可以做到这一点吗?另外,不确定这是否重要,但getRecords
返回一个Promise
。不过,在稍后进入抽象服务之前,我不想开始处理Promise
。
在函数式编程术语中,你描述的是 Currying,而在 JavaScript 中,你可以使用bind()
函数实现最简单的概念:
const getRecordsWrapper = getRecords.bind(null, userId, options);
传递给bind
的第一个参数是要调用的稍后函数的函数上下文(this
(,而其余参数则作为常规参数传递。
如果你正在寻找一个功能齐全的JavaScript函数式编程框架,看看Ramda.js(例如(。
使用bind()
是个好主意。这是一个替代方案。把它留给读者哪个是首选。
function copyRecords(userId, options) {
return () => {
return getRecords(userId, options);
}
};
请注意,这与以下内容几乎相同:
function copyRecords(userId, options) {
return getRecords.bind(this, userId, options);
};
所以它归结为主观偏好。
由于部分应用程序是一个常见问题,因此有人建议直接在javascript中支持它而无需.bind
。如果提案获得通过,它将如下所示:
new MyAbstractionService(getRecords(userId, options, ...))