有没有办法在未来链中执行副作用,而不改变价值传播



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

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

我正在寻找类似的东西:

.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

你可以做这样的事情:

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)

您可能正在寻找andThen运算符:

something.getResource()
.flatMap(resource => resource.getUsageResult() andThen { case _ => resource.free() })
.flatMap(usageResult => mutate(usageResult))

最新更新