我已经在期货中定义了一些API调用,这些API调用会对Mashery和Stripe进行API调用
val stripeFuture = Future { // api call }
val masheryFuture = Future { //api call }
对于stripeFuture - 主要逻辑是在onSuccess块中的客户端对象上设置 stripeCustomerId
stripeFuture onSuccess {
//client.stripeCustomerId
}
我已经完成了与Futures and Promises
中的示例类似的for-comprehension中的API调用 val apiCalls = for {
masheryInfo <- masheryFuture
stripeCustomer <- stripeFuture
}
如果其中一个API调用失败,则会回滚
apiCalls onFailure {
case pse: MasheryException => {
// delete stripe customer id
}
case e: StripeException => {
//delete mashery api key
}
问题是,当对Mashery的调用失败'masheryFuture'时,我想从客户端对象中回滚'获取条带ID'但是有一个大约1秒的延迟直到该调用结束并且不会设置stripeCustomerId 直到它到达onSuccess块,所以在ase pse中:MasheryException =&gt; {}阻止, client.getstripeCustomerId返回null 。
有没有办法绕过这两个API调用的竞争条件
答案 0 :(得分:5)
使用Future.andThen
。
文档:
将副作用函数应用于此未来的结果,并且 这个未来的结果将带来一个新的未来。
此方法允许强制执行回调在a中执行 指定的顺序。
for (f <- Future(x).andThen { y })
等。
更新
for (f <- Future(x) andThen {
case Success(x) => use(x)
case _ => // ignore
}) yield result