在管道函数内检查值

Check value in when inside an pipe function

如果 R.cond 解析一个未定义的值,应该执行一个 pipe 函数 并将值 传递给 pipe 函数。 .

const publishClient = (resp, cb) => {
  console.log('Publishing ', resp);
  cb()
}

// Applying same process
const format = (letter) => ({'letter': letter});
const concact =  R.curry((num, letter) => num + '=' + letter);

// my method publish
const publish = partialRight(publishClient, [function() { console.log('Callback called!') }]);

// conditions to check
const condToRes = R.cond([
  [equals(1), concact('A')],
  [equals(2), concact('B')],
  [equals(3), concact('C')],
  [equals(4), concact('D')],
  [equals(5), concact('E')],
]);

// Publish only if condition resolves
// const resolveCond = when(condToRes, pipe(format, publish)) // NOT WORK,concact FN is ignored!
const resolveCond = pipe( // TRYING
  condToRes,
  when(HOW TO CHECK condToRes IS NOT NIL, pipe(format, publish))
);


// Call
resolveCond(1)

// SHOULD DISPLAY ..
Publishing 
{"letter":"A=1"}
Callback called!

要测试一个值是 null 还是 undefined,您可以使用 R.isNil。当与 R.complement 组合子组合时,这将产生一个函数,当应用于 not null/[= 的值时,该函数的计算结果为 true 13=].

这可用于将您的示例更新为:

const resolveCond = pipe(
  condToRes,
  when(complement(isNil), pipe(format, publish))
);

或者,可以使用 R.unless 代替 R.when,这样就无需将 R.isNil 换成 R.complement

const resolveCond = pipe(
  condToRes,
  unless(isNil, pipe(format, publish))
);

这两种方法是等效的,尽管 R.unless 可能读起来更好一些。