Цепные функции в JavaScript
Есть ли способ объединить функции в JavaScript, чтобы при вызове последней функции в цепочке учитывались все функции в цепочке, которые были указаны. По сути, я пытаюсь сделать то же, что и экспресс-валидатор: что-то вроде этого:
check('password').passwordValidator().optional();
Я хочу иметь возможность звонить
check('password').passwordValidator();
а также
check('password').passwordValidator().optional();
5 ответов
Итак, вы ищете что-то вроде строителя? Вы можете сделать это так:
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()
в примере, чтобы сигнализировать, что вы действительно хотите сделать вещь сейчас.
В конце концов я использовал то, что предложил @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();
var Obj = {
result: 0,
addNumber: function(a, b) {
this.result = a + b;
return this;
},
multiplyNumber: function(a) {
this.result = this.result * a;
return this;
},
divideNumber: function(a) {
this.result = this.result / a;
return this;
}
}
Obj.addNumber(10, 20).multiplyNumber(10).divideNumber(10);
ссылка => https://medium.com/technofunnel/javascript-function-chaining-8b2fbef76f7f
Вызов цепного метода 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)
);