1

我有一个工作但乏味的代码。

我有 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 回调需要一个函数来处理两个参数(错误状态和值),我不知道如何扩展我的回调以使其通用以包含我的状态信息。

是否有设计模式来简化这些回调创建?

4

1 回答 1

1

您要查找的术语是部分应用。制作一个通用句柄函数,如下所示:

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

你想要的是一个高阶函数,它接受一个函数,一些参数的固定值,并返回一个采用“其余参数”的新函数,该函数使用固定参数和给定参数调用原始函数.

这种技术称为部分应用。您可以自己编写此函数(使用现代 Node 版本中可用的标准 ES6 语法):

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

这在 Lodash中也可用,因为它是一种非常常见的设计模式。

然后您可以将处理程序分配为

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

因为partial(handle, 0, 1, Eval0)它本身就是一个函数,它的前两个参数将成为处理程序中的errand A

于 2019-05-05T06:28:31.990 回答