javascript - 将 IF/Else 条件转换为 Ramda Cond 失败
问题描述
使用 Ramda 在 E2E 上工作。我不知道如何使用 Ramda Cond 转换简单的 IF 条件。
使用 If 的代码:
if (constraint == 'required') {
// then only do something
await waitForElementToBeClickable(constraintElement);
await constraint.click();
}
我不想要 else ,因为我希望只有在存在约束的情况下才会发生动作。
到目前为止,我已经使用约束完成了此操作,但它不起作用:
await waitForElementToBeClickable(cond([
[equals('required'), always(constraintElement)],
])(constraint), this.browser);
const constraintCheck = cond([
[equals('required'), () => constraintElement.click()],
]);
await constraintCheck(constraint);
在某些情况下,我不想通过约束。然后条件根本不应该执行。但它总是被执行并抛出错误:无法读取未定义的属性“isPresent”。
解决方案
我认为这里可能有些混乱(除了 customcommander 正确指出的类型之外constraint
。)
Ramda 试图提供的功能之一是允许我们使用表达式而不是语句进行编程。尤其是控制流语句。但是一个看起来像这样的声明:
let foo
if (condition) {
foo = 'bar'
} else {
foo = 'baz'
}
已经有一个标准的表达形式:
const foo = condition ? 'bar' : 'baz'
Ramda 并没有真正尝试提供替代方案。但是我们可能会尝试使用另一种方法if
:
let foo
if (test(val)) {
foo = bar(val)
} else {
foo = baz(val)
}
在这里,当使用函数时,Ramda 提供了一种方便的速记:
const getFoo = ifElse(test, bar, baz)
// ... later
const foo = getFoo(val)
(如果你只是想
val
在测试失败的情况下返回,你可以使用简写:const foo = when(test, bar)
或者如果你想
val
在测试成功时,你可以做const foo = unless(test, baz)
)
虽然将代码转换为
const foo = ifElse(test, bar, baz)(val)
这不是重点。基本原理ifElse
是在创建可重用函数时使用它ifElse(test, bar, baz)
。(cond
是一样的,只是提供一系列条件-结果对而不是一个if
和一个else
。)
请注意其中的一个重要特性:测试函数、如果为真则运行的函数以及如果为假则运行的函数都具有相同的签名。如果其中一个接受三个参数,那么它们都应该接受三个参数。虽然测试应该返回一个布尔值,但其他两个可以有任何返回类型,但每个应该具有与另一个相同的返回类型。
因此,可以使用 thunk,当您尝试使用 时() => constraintElement.click()
,它主要是对 Ramda 功能的滥用。它可能不会在您的代码中为您带来任何好处。
目前尚不清楚您要如何处理从if
语句到ifElse
or的转换cond
。请随时为您的问题添加更新,更全面地解释您要做什么,以及您要通过此转换解决什么问题,有人可能会提供一些帮助。但请确保您澄清什么constraint
和constraintElement
是什么以及waitForElementToBeClickable
解决什么。现在它相当混乱。
推荐阅读
- excel - Excel 公式使用变量作为其他工作表中的行引用
- internet-explorer - Why isn't my SVG displaying correctly in IE1 or /Edge?
- azure - 如何为 MVC+Angular 应用程序实现 CI/CD
- android - 为 Here 自动完成 api 设置语言环境(和反向地理编码)
- wordpress - 上传文件后 PHP 7 延迟 - 必须等待近 1 分钟才能看到结果
- php - 如何从 ORACLE SQL 数据库调用/触发 PHP 脚本
- java - 根据 Java8 中的逻辑表达式验证 JSON
- ios - 是否可以在 iOS 应用程序中热交换离子代码?
- ruby-on-rails - 升级到 Rails 6 时 Active Storage 迁移出现错误
- kubernetes - Kubernetes——如果configmap改变了如何触发job?