Цепные функции в JavaScript - PullRequest
       1

Цепные функции в JavaScript

0 голосов
/ 11 января 2019

Есть ли способ объединить функции в JavaScript, чтобы при вызове последней функции в цепочке учитывались все функции в цепочке, которые были указаны. В основном то, что я пытаюсь сделать, это то же самое экспресс-валидатор делает: Примерно так:

check('password').passwordValidator().optional();

Я хочу иметь возможность звонить

check('password').passwordValidator();

и

check('password').passwordValidator().optional();

Ответы [ 3 ]

0 голосов
/ 11 января 2019

Вызов связанного метода express-validator возвращает функцию промежуточного программного обеспечения, и, поскольку функции могут иметь свойства, вы можете вызвать метод для этой возвращенной функции, которая возвращает новую функцию с методами и так далее. Цепные функции довольно просты:

 const chain = (pairs, fn = el => el) => {
   for(const [key, method] of pairs)
     fn[key] = (...opt) => chain(pairs, method(fn)(...opt));
   return fn;
};

const math = chain([
  ["add", prev => a => b => prev(b) + a],
  ["mul", prev => a => b => prev(b) * a]
]);

console.log(
  (math.add(5).mul(3).add(3))(5)
 );
0 голосов
/ 11 января 2019

Я закончил тем, что предложил @ coolreader18. Это было именно то, что я искал.

function func(val) {
    var self = this;
    this._optional = false;
    this._check = false;

    const doStaff = (message = 'Doing staff') => {
        console.log(message);
        return;
    };


    return {
        check: function(n) {
            this._check = true;
            return this;
        },
        optional: function(n) {
            this._check = false;
            this._optional = true;
            return this;
        },
        exec: function() {
            if (this._check) doStaff();
            if (this._optional) doStaff('Maybe not');
        }
    }
}

func().check().optional().exec();
0 голосов
/ 11 января 2019

Итак, вы ищете некий шаблон строителя ? Вы можете сделать это так:

class Foo {
  _passwordValidator = false;
  _optional = false;

  passwordValidator() {
    this._passwordValidator = true;
    return this;
  }
  optional() {
    this._optional = true;
    return this;
  }

  doThing() {
    if (this._optional) { /* ... */ }
    if (this._passwordValidator) { /* ... */ }
  }
}

const foo = new Foo().passwordValidator().optional();

foo.doThing();

Редактировать: чтобы более прямо ответить на ваш вопрос, нет способа ждать, чтобы что-то сделать, пока не будет завершена текущая цепочка вызовов методов; Вы должны вызвать метод, подобный doThing() в примере, чтобы указать, что вы действительно хотите сделать это сейчас.

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