[英]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
如果它们都是1
或0
如果它们中的任何一个是0
。
当然,结果将是一个数字,而不是 boolean,但您可以将其转换回来:
onClose={() => Boolean(!isPostingConfig & onClickAway() & clearRoleErrors())}
你可以给自己andAll
和orAll
辅助函数:
onClose={() => andAll(!isPostingConfig, onClickAway(), clearRoleErrors())}
数组方法every
(= AND) 和some
(= OR) 都可以,但有点麻烦:
onClose={() => [!isPostingConfig, onClickAway(), clearRoleErrors()].every(Boolean)}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.