包含api的Scala 2期货称为竞争条件

时间:2014-02-07 16:57:49

标签: api scala playframework

我已经在期货中定义了一些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调用的竞争条件

1 个答案:

答案 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