Javascript совместно использует общий обратный вызов с уникальными состояниями - PullRequest
1 голос
/ 05 мая 2019

У меня есть рабочий, но утомительный код.

У меня есть 6 из onoff объектов для описания 6 входов GPIO. Все они должны зарегистрировать обратный вызов [т.е. obj.watch (callback)] для обнаружения изменения состояния.

В настоящее время мой функциональный код выглядит следующим образом

Var states = [[0,0], [0,0], [0,0]];
Var handle0 = function (err, A) {
    State[0][0] = A;
    Eval0(state[0]);
}
Var handle1 = function (err, A) {
    State[0][1] = A;
    Eval0(state[0]);
}
Var handle2 = function (err, A) {
    State[1][0] = A;
    Eval1(state[1]);
}
Var handle3 = function (err, A) {
    State[1][1] = A;
    Eval1(state[1]);
}
Var handle4 = function (err, A) {
    State[2][0] = A;
    Eval2(state[2]);
}
Var handle5 = function (err, A) {
    State[2][1] = A;
    Eval2(state[2]);
}
Input0.watch(handle0);
Input1.watch(handle1);
Input2.watch(handle2);
Input3.watch(handle3);
Input4.watch(handle4);
Input5.watch(handle5);

Как видите, процедуры в основном одинаковы, но им просто необходим доступ к различным переменным. Однако, поскольку обратный вызов onoff.watch ожидает, что функция будет обрабатывать два параметра (состояние ошибки и значение), я не знаю, как расширить свой обратный вызов, чтобы сделать его общим для включения информации о моем состоянии.

Существует ли шаблон проектирования, упрощающий создание этих обратных вызовов?

1 Ответ

1 голос
/ 05 мая 2019

Вы ищете термин частичное применение .Сделайте общую функцию управления следующим образом:

function handle(x, y, evalFn, err, A) {
    State[x][y] = A;
    evalFn(state[x]);
}

Вам нужна функция высшего порядка , которая принимает функцию , фиксированные значения для some аргументов и возвращает новую функцию , принимающую «остальные аргументы», которая вызывает исходную функцию с фиксированными аргументами и заданными аргументами.

Такой методназывается частичное применение .Вы можете написать эту функцию самостоятельно (используя стандартный синтаксис ES6, доступный в современных версиях Node):

function partial(fn, ...fixedArgs) {
    return (...args) => fn(...fixedArgs, ...args)
}

Это также доступно в Lodash , так как это очень распространенный шаблон проектирования.

Затем вы можете назначить обработчики как

Input0.watch(partial(handle, 0, 1, Eval0));

Поскольку partial(handle, 0, 1, Eval0) сама является функцией, чьи первые два аргумента станут err и A в обработчике.

...