当前位置: 首页 > 知识库问答 >
问题:

有没有办法在不改变价值传播的情况下,在未来的链中产生副作用

强德厚
2023-03-14

我有一个未来链,它获取一个资源,使用它来检索一些数据,然后修改该数据并返回结果(仍然在未来)。

我希望在返回未来链之前释放资源,但不必插入更接近的样板代码(即,将中间结果放入某个变量中,然后将其作为链其余部分的结果返回)。

我在找这样的东西:

.getResource() //returns future
   .flatMap(resource => resource.getUsageResult()) //returns future
    .FUNCTION_I_NEED(resource.free()) 
    //executes for failures and successes, doesn't change propagated exceptions or values
   .flatMap(usageResult => mutate(usageResult)) //returns future

共有2个答案

姚高爽
2023-03-14

您可能正在寻找和然后-运算符:

something.getResource()
.flatMap(resource => resource.getUsageResult() andThen { case _ => resource.free() })
.flatMap(usageResult => mutate(usageResult))
须曜文
2023-03-14

你可以这样做:

getResource()
  .flatMap(resource => {
    resource.getUsageResult()
      .map(result => {
        // .map makes sure the usage result is done
        // do your side effect here
        yourSideEffectOn(resource)
        // return the result again so you can do something with it
        result
      })
  })
  .flatMap(usageResult => mutate(usageResult))

你应该能够通过使用理解来简化它:

for {
  resource <- getResource()
  usageResult <- getUsageResult(resource)
} yield {
  yourSideEffectOn(resource) // will not wait if it returns a future
  mutate(usageResult)
}

如果我没记错的话,这也应该有效:

for {
  resource <- getResource()
  usageResult <- getUsageResult(resource)
  _ = yourSideEffectOn(resource) // will not wait if it returns a future
} yield mutate(usageResult)

如果你想等待副作用也完成(如果它失败了,就中断),你也可以平面映射副作用:

for {
  resource <- getResource()
  usageResult <- getUsageResult(resource)
  _ <- yourSideEffectOn(resource) // will wait for side effect to finish
} yield mutate(usageResult)
 类似资料:
  • 大概是这样的: 谢谢[已解决] 也感谢Umer Farooq的回答:从lambda内部修改局部变量

  • 使用PHP-PDO和SQLite,我可以编写一个PDO调用来检查表中是否存在某一行(通过检查主键),如果不存在,则编写另一个PDO调用来创建该行。但我觉得应该可以在一个命令中实现……类似于“如果不存在,则创建表”。是否有类似“不存在时插入行”的内容?

  • 如果一个中间操作消耗了流的一些元素,之后使用了peek(),但没有终端操作,那么peek()是否还应该产生一些输出呢?

  • 所以我想要一个“Void Repository”,通过它可以访问不一定在实体上操作的存储过程。 但这当然不起作用,因为期望是一个实体。 有没有一种方法可以使用注释而无需创建虚拟实体,或者我是否坚持使用使用通过准备好的语句进行查询的已实现类? 因为老实说,这很难看:

  • 问题内容: 关于将行旋转为各种数据库的列,有很多文章。他们似乎分为两个阵营,使用案例语句或使用数据库供应商的内置功能。我正在使用 MySQL ,到目前为止,尚未在任何内置函数上找到任何东西,该函数使我可以选择任意数量的行值(希望将其转换为列)。如果我不提前知道这些值,则无法构建经常出现在stackoverflow上的CASE查询。我想知道MySQL中是否有类似于其他数据库中称为交叉表或数据透视表的

  • 我再次编写另一个银行系统插件,但这次是使用ATM。我正在尝试弄清楚如何在单击该选项后获得玩家聊天输入,以防止单击100次以在银行帐户上存入50,000美元。 我正在用Paper-Spigot 1.14.4编写这个插件,我尝试了以下步骤: 作为一个单独的类,仅当我向插件管理器注册事件时才激活: 使用 get 和 set-method创建一个 变量 ,并在需要时在该方法中调用它。 我当前的方法: 获取