Вы можете сделать что-то вроде этого:
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)
Если вы хотите дождаться окончания побочного эффекта (и прервать его, если он не получится), вы можете также использовать flatMap побочного эффекта:
for {
resource <- getResource()
usageResult <- getUsageResult(resource)
_ <- yourSideEffectOn(resource) // will wait for side effect to finish
} yield mutate(usageResult)