首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用转型驾驭未来

用转型驾驭未来
EN

Stack Overflow用户
提问于 2020-03-29 21:00:42
回答 1查看 39关注 0票数 1

我在Scala上有一个电报机器人,如果它存在,我想发送图像给用户,如果它不存在,我想发送消息“对不起,图像不存在”。我有一个函数getImage(tag),它返回Future.successful(link)Future.failed(NoImageException(msg))

代码语言:javascript
复制
onCommand("/img") { implicit msg =>
  val tag = msg.text.get.drop("/img ".length)
  try {
    if (tag.isEmpty) throw new IndexOutOfBoundsException()
    service.getImage(tag).transform {
      case Success(link) => Success(
        try {
          replyWithPhoto(InputFile(link))
        } catch {
          case _ => reply(link) // maybe it isn't a photo...
        })
      case Failure(e) => Success(reply(e.getMessage))
    }.void
  } catch {
    case _: IndexOutOfBoundsException => reply("Empty argument list. Usage: /img tag").void
  }}

如果成功,此代码将发送一个图像,但如果失败,则不会发送消息(但在本例中,它肯定选择case Failure(e) )

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-30 02:35:59

reply系列函数返回一个Future[Message]。目前您将reply的结果包装在Success中,因此您的transform的结果是Future[Future[Message]],这是不起作用的。相反,您可以使用transformWith,它的参数应为Future结果:

代码语言:javascript
复制
onCommand("/img") { implicit msg =>
  val tag = msg.text.get.drop("/img ".length)
  val message: Future[Message] =
    if (tag.isEmpty) reply("Empty argument list. Usage: /img tag")
    else {
      service.getImage(tag).transformWith {
        case Success(link) => replyWithPhoto(InputFile(link)).recoverWith {
          case _ => reply(link) // maybe it isn't a photo...
        }
        case Failure(e) => reply(e.getMessage)
      }
    }
  message.void
}

请注意,我还删除了这两个try操作符。外部是不必要的,因为您可以只使用if/else。内部函数根本不起作用,因为replyWithPhoto返回一个Future。所以它不会抛出错误,当它失败时,你需要使用recovertransform

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60914673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档