Сохранить аргументы для последующего JavaScript - PullRequest
0 голосов
/ 01 июля 2018

Название этого вопроса, вероятно, вводит в заблуждение. У меня возникли проблемы с тем, чтобы обернуть голову вокруг этой концепции. Я хочу передать все аргументы в функцию, но вызвать ее с этими аргументами позднее .

В настоящее время я делаю что-то вроде этого:

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 голосов
/ 01 июля 2018

Использование bind() - хорошая идея. Вот альтернатива. Оставляя это на усмотрение читателей.

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

Обратите внимание, что это в значительной степени идентично:

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

Так что все сводится к субъективным предпочтениям.

0 голосов
/ 01 июля 2018

Поскольку частичное применение является распространенной проблемой, существует предложение , чтобы поддержать это непосредственно в JavaScript без .bind. Если предложение пройдет, оно будет выглядеть так:

new MyAbstractionService(getRecords(userId, options, ...))
0 голосов
/ 01 июля 2018

В терминах функционального программирования вы описываете Curry , а в JavaScript вы можете достичь простейшего представления об этом, используя функцию bind():

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

Первый аргумент, передаваемый bind, является контекстом функции (this) функции, которая должна быть вызвана позднее, а остальные аргументы передаются как обычные аргументы.

Если вы ищете полнофункциональную функциональную среду программирования на JavaScript, взгляните на Ramda.js (например).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...