【发布时间】:2013-03-08 13:18:46
【问题描述】:
当谈到抛出全面错误时,我很好奇人们如何生成长 if 语句而不为每种可能性抛出消息。
以下内容的好处:
if(typeof hello !== "undefined" && hello == 3){
}
这两个条件都是必要的。我尝试过使用数组和对象来处理 if 语句,如下所示。
var validate = [
(typeof hello !== "undefined"),
(hello == 3)
];
然后您可以使用类似underscore 的_.without() 函数来获取true 与false 值并检查是否有任何错误。上面这个数组的问题是,如果 hello 未定义,就会报错。
var validate = [
(typeof hello !== "undefined"),
(typeof hello !== "undefined" && hello == 3)
];
所以我必须这样做,这是非常重复的。
到目前为止,这些例子还没有得到任何回应。我刚想出这个。
var valid = [
(_.isObject(email)) ? false : "email is not object",
(dotty.exists(email, "event")) ? false : "event does not exist",
(email.event == "inbound") ? false : "event is not set to inbound",
(dotty.exists(email, "ts")) ? false : "ts does not exist"
];
var errors = _.without(valid, false);
if(errors.length == 0) // no errors
哪个更进步。
var valid = [
(_.isObject(email)) ? false : "email is not object",
(dotty.exists(email, "event")) ? false : "event does not exist",
(dotty.exists(email, "event") && email.event == "inbound") ? false : "event is not set to inbound",
(dotty.exists(email, "ts")) ? false : "ts does not exist"
];
var errors = _.without(valid, false);
if(errors.length == 0) // no errors
但我仍然需要详细说明。
这一切都带来了下一个想法。
有两个要处理的错误。
- 当出现错误时,在继续之前处理该错误
- 显示所有错误
我更喜欢后者。
是否存在任何库来帮助复杂的 if 语句进行验证?
更新
因为下一个语句与前一个无关,有时这很好,我陷入了一个疯狂的斜坡。
一定有办法防止这种情况发生……
typeof email !== "undefined"
typeof email !== "undefined" && _.isObject(email))
typeof email !== "undefined" && _.isObject(email)) && dotty.exists(email, "event"))
typeof email !== "undefined" && _.isObject(email)) && dotty.exists(email, "event")) && email.event == "inbound"
v.s 易于阅读
typeof email !== "undefined"
_.isObject(email))
dotty.exists(email, "event"))
email.event == "inbound"
我希望它更简单并且没有斜率。在下面的示例中,假设 email 是 undefined 但 color 是并且它等于 yellow。我很想看到以下错误报告
(typeof email !== "undefined") ? false : "no email",
(_.isObject(email)) ? false : "email isn't object",
(dotty.exists(email, "event")) ? false : "event not present",
(email.event == "inbound") ? false : "event not inbound",
(typeof color !== "undefined") ? false : "no color",
(color == "yellow") ? false : "color not yellow",
[
"no email",
"email isn't object",
"event not present",
"event not inbound",
false,
false
]
换句话说,我希望颜色不会作为错误返回,因为它是有效的。但我想返回所有其他错误。
或者我只需要:
[
"no email",
false,
false
]
如果 color 和 email 都未定义,我不想看到:
[
"no email"
]
这是误导。我至少想看看
[
"no email",
"no color"
]
或全部
[
"no email",
"email isn't object",
"event not present",
"event not inbound",
"no color",
"color not yellow"
]
更多倾斜示例:
var valid = [
(typeof email !== "undefined") ? false : "email is undefined", // halt the code
(typeof email !== "undefined" && _.isObject(email)) ? false : "email is not object",
(typeof email !== "undefined" && dotty.exists(email, "event")) ? false : "event does not exist",
(typeof email !== "undefined" && dotty.exists(email, "event") && email.event == "inbound") ? false : "event is not set to inbound",
(typeof email !== "undefined" && dotty.exists(email, "ts")) ? false : "ts does not exist"
];
var errors = _.without(valid, false);
if(errors.length == 0) // no errors
【问题讨论】:
-
您是否正在尝试自动调用验证脚本,同时保持每个无效条件的详细程度?
-
@JaredFarrish 我想是的。
-
这听起来就像您在谈论rules engine(注意,这是Java,但概念适用)。所以你可能会寻找 Javascript 规则引擎,也许是JSON Rules?也许Node.js nools 可能有用。
-
@JaredFarrish 这些是非常有趣的资源。非常感谢。我想与你分享我想到的一个想法,即使用对象并在下一个 if 语句中引用它们。节省空间并提供出色的错误响应。 gist.github.com/reggi/5202723
-
这个nools example 看起来真的与您正在前往的地方相似。
标签: javascript validation error-handling conditional