Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使if条件看起来更干净?_Javascript_Node.js - Fatal编程技术网

Javascript 如何使if条件看起来更干净?

Javascript 如何使if条件看起来更干净?,javascript,node.js,Javascript,Node.js,如果条件看起来更干净,并且将来可以像开放-封闭原则那样轻松添加更多查询搜索,那么有没有办法做到这一点 例如: if (event.queryParameters["name"]) { result = await getResultByName(event.queryParameters["name"]); } else if (event.queryParameters["emailAddress"]) { result = await getResultByEmail(eve

如果条件看起来更干净,并且将来可以像开放-封闭原则那样轻松添加更多查询搜索,那么有没有办法做到这一点

例如:

if (event.queryParameters["name"]) {
    result = await getResultByName(event.queryParameters["name"]);
} else if (event.queryParameters["emailAddress"]) {
    result = await getResultByEmail(event.queryParameters["emailAddress"]);
} else if (event.queryParameters["param1"]) {
    result = await getResultByParam1(event.queryParameters["param1"]);
} else if (event.queryParameters["something1"] && event.queryParameters["something2"]) {
    result = await getResultBySomething(event.queryParameters["something1"], event.queryParameters["something2"]);
}

正如您所见,它看起来非常凌乱。

因此,您所拥有的内容看起来非常可读、简单、干净。如果需要更大的灵活性,可以创建事件处理程序列表:

eventHandlers = [nameHandler, emailHandler, ...];
var result;
for (var handler of eventHandlers) {
    if (result = handler(event)) break;
}

在本例中,事件处理程序是函数,如果事件已被使用,则返回结果,并且处理应结束。在您的情况下,您的结果可以是承诺或任意值。

制作一个条目表并使用:

原始代码的问题在于它不是干的,因此任何增量修改都不可避免地重复已经编写的代码

比较以下两个增量更改:

...
{ keys: ['fizz', 'buzz', 'fizzbuzz'], getResultBy: getResultByFizzBuzz }

请告诉我,每次返回并添加新函数时,您希望键入哪一个。

由于值不同,函数也不同,因此没有多少改进的余地

没有必要使用括号表示法,也没有理由每次都引用
事件
对象

它可以写为:

const { queryParameters } = event;

if (queryParameters.name) {
    result = await getResultByName(queryParameters.name);
} else if ...
除非同一情况在多个地方发生,并且可以干燥,否则无法进行其他改进:

const paramHandlers = [
  { handler: getResultByName, paramNames: ['name'] },
  ...
];

然后可以迭代
paramHandlers
以检查
paramNames
是否匹配
event.queryParameters
属性。

对于事件查询参数,使用新的
get()
函数怎么样?例如:
get('email')
我认为没有理由这么做。它并不比
queryParameters.name
简单。如果
queryParameters
包含太多字符,则变量的名称可能会较短。此外,如果
避免使用
else If
,而只使用多个
If
,这将导致不同的逻辑。如果有多个参数,将调用多个函数。如果这是您想要的,请坚持使用
If
。否则
else如果
是正确的方法。您在查询什么?一个数据库?为了确保问题清楚,到底是什么让这段代码“不那么干净”?我投票决定关闭这段代码,因为我需要一个主要基于意见的答案。这并不是说这不是一个好问题,而是一个好问题。但很明显,这个话题引发的辩论比必要的多,而且当讨论的大多数所谓“问题”都是完全假设的时候,很难给出客观的答案。不,这个答案是正确的。目标不是为他写OP的代码,但是要给他正确的使用方法。你如何使用这种方法来使用
结果
。@JakeHolzinger处理程序可以返回如上所述的结果。这种解决方案无法简化示例代码,并且暗中隐藏了每个
处理程序
函数中容易忽略的样板文件需要包装OP.Error@PatrickRoberts中使用的函数。这里绝对没有任何东西可以阻止异步处理。你应该学会承诺是如何起作用的。显然,处理程序只有在接受事件时才会返回承诺。也根本没有样板。根据定义,每个处理程序处理不同的用例。您的其他注释不相关。如果任何函数需要获取
事件中没有的其他参数,则此操作将无效。查询参数
或使用
事件的其他属性
,这是非常常见的要求。这过于复杂,不能满足OP以可维护的方式轻松添加新用例的需求。(注意:Mods删除了以前的评论。如果您要允许对其他答案发表评论,则应允许对所有答案发表评论。)请参阅此处的旧评论,了解此操作不起作用的原因:
const { queryParameters } = event;

if (queryParameters.name) {
    result = await getResultByName(queryParameters.name);
} else if ...
const paramHandlers = [
  { handler: getResultByName, paramNames: ['name'] },
  ...
];