繁体   English   中英

确保在评估之前运行 javascript 中链式比较器中的所有方法?

[英]Ensure all methods in a chained comparator in javascript are run before evaulating?

如果我有以下代码段:

onClose={() => !isPostingConfig && onClickAway() && clearRoleErrors()}

我知道如果!isPostingConfig返回一个falsy值,则不会评估onClickAway()clearRoleError() ,即这些方法将不会运行。

我知道我可以通过包装一个方法来规避这个问题。

evaulate(){
  var a = !isPostingConfig
  var b = onClickAway()
  var c = clearRoleError()

  return a && b && c
}

但是,在评估运算符之前,是否更容易确保链式运算符中的所有方法都运行?

您可以创建一个函数数组,并使用Array.reduce()循环。 使用逻辑与运算符 ( && ) 将每个 function 的结果与前一个结果组合。 所有函数都将执行,如果所有函数都返回true ,则最终结果保持true ,如果至少有一个返回false ,则最终结果保持为false

const evaluate = (...args) => args.reduce((r, fn) => r && fn(), true)

你可以这样称呼它:

evaluate(() => !isPostingConfig, onClickAway, clearRoleError)

如果不想用 function 包装所有表达式,可以添加 typeof 检查:

const evaluate = (...args) => args.reduce((r, item) => r && (typeof item === 'function' ? item() : item), true)

并这样称呼它:

evaluate(!isPostingConfig, onClickAway, clearRoleError)

但是,在评估运算符之前,是否更容易确保链式运算符中的所有方法都运行?

您可以使用&而不是&&假设您正在处理布尔值(您使用的是!isPostingConfig ,但我不知道您的函数的返回值)。 &是按位与运算符。 它总是评估它的两个操作数。 然后它将它们转换为 32 位整数并将它们与在一起。 false转换为0并且true转换为1 ,因此对于 boolean 值, a & b & c将为1如果它们都是10如果它们中的任何一个是0

当然,结果将是一个数字,而不是 boolean,但您可以将其转换回来:

onClose={() => Boolean(!isPostingConfig & onClickAway() & clearRoleErrors())}

你可以给自己andAllorAll辅助函数:

onClose={() => andAll(!isPostingConfig, onClickAway(), clearRoleErrors())}

数组方法every (= AND) 和some (= OR) 都可以,但有点麻烦:

onClose={() => [!isPostingConfig, onClickAway(), clearRoleErrors()].every(Boolean)}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM