0

我有一个 HTTP API 端点,我需要不断检查新值。幸运的是,它支持长轮询。所以我的想法是我需要实现一个“无限循环”,在那里我发出一个请求,等待一个响应(最多 10 分钟),从响应中获取一些值并通过将它们存储在某个地方产生副作用,发出另一个请求。

鉴于我有一些函数调用将启动这个“无限循环”,我还需要返回一个Closable来满足我正在集成的 Finagle API,以便可以中断该过程。如果 HTTP 请求失败,我需要立即重试。

现在我需要弄清楚如何Future在 Finagle 中使用 s 来实现这一点。我想知道我是否可以通过对响应 Future 应用转换来使用递归?.. 还是我错过了一些东西并且在 Finagle 中有更直接的方法来做到这一点?

谢谢!

4

1 回答 1

2

我不确定我能想象它(你所描述的)如何比递归更直接:

  def keepCalling: Future[Unit] = makeRequest
    .flatMap { response => 
       processResponse(response)
       if(cancelled) Future.Unit else keepCalling
     }

请注意,这实际上不是传统意义上的递归,因为我们通常应该期望(有一些保留)keepCalling在任何给定时间只有一个实例在堆栈上,因为“递归”调用发生在不同的线程上。

于 2016-06-23T10:53:25.800 回答