我想知道是否可以创建某种“方法调用链”,所有方法都返回相同的 Either[Error,Result]。
我想做的是:依次调用所有方法,当方法返回一个Left(错误)时,停止方法调用并返回调用链中找到的第一个Left。
我尝试了一些东西,包括折叠、地图、投影......但我是 Scala 新手,没有找到任何优雅的解决方案。
我尝试过这样的事情:
def createUserAndMandatoryCategories(user: User) : Either[Error,User] = {
User.create(user).right.map {
Logger.info("User created")
Category.create( Category.buildRootCategory(user) ).right.map {
Logger.info("Root category created")
Category.create( Category.buildInboxCategory(user) ).right.map {
Logger.info("Inbox category created")
Category.create( Category.buildPeopleCategory(user) ).right.map {
Logger.info("People category created")
Category.create( Category.buildTrashCategory(user) ).right.map {
Logger.info("Trash category created")
Logger.info("All categories successfully created created")
Right(user)
}
}
}
}
}
}
但它不起作用。无论如何,我真的不喜欢它需要的缩进。此外,我想将错误转换为描述问题的新字符串(我想我应该使用折叠?)
我正在寻找这样写的东西:
val result : Either[String,CallResult] = call1.something("error 1 description")
.call2.something("error 2 description")
.call3.something("error 3 description")
.call4.something("error 4 description")
有可能用 Scala 做这样的事情吗?也许同时使用 Either 和 Option?
一个限制也是,如果第一次调用失败,则不应进行其他调用。我不想要一个我调用所有东西然后加入其中一个的解决方案。
谢谢!