保存参数以备后用Javascript

时间:2018-06-30 21:35:49

标签: javascript function

此问题的标题可能会引起误解。我在解决这个问题时遇到了一些麻烦。我想将所有参数传递给一个函数,但是用那些参数 later 调用它。

我目前正在做这样的事情:

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

3 个答案:

答案 0 :(得分:2)

在函数式编程方面,您要描述的是Currying,而在JavaScript中,您可以使用bind()函数来实现最简单的想法:

const getRecordsWrapper = getRecords.bind(null, userId, options);

传递给bind的第一个参数是后来被称为函数的函数上下文(this),而其余参数作为常规参数传递。

如果您正在寻找JavaScript中功能全面的功能编程框架,请查看Ramda.js(例如)。

答案 1 :(得分:1)

使用bind()是个好主意。这是另一种选择。优先考虑给读者看。

function copyRecords(userId, options) {
  return () => {
    return getRecords(userId, options);
  }
};

请注意,这与以下内容完全相同:

function copyRecords(userId, options) {
  return getRecords.bind(this, userId, options);
};

因此归结为主观偏好。

答案 2 :(得分:1)

由于部分应用是一个常见问题,因此有一个proposal可以直接在javascript中支持而无需.bind。如果提案获得通过,它将如下所示:

new MyAbstractionService(getRecords(userId, options, ...))