撰写期货 - 如何获得与期货清单结果相关的另一个变量

时间:2013-09-18 20:36:57

标签: scala akka future

我对未来的构图有点新意,所以我还没有想出所有常见的模式。

我有一个期货清单,但我需要在创建时将名称与期货关联起来,这样我就能以某种方式协调清单。

EG如果我创建这样的期货清单,我怎样才能让x与未来的结果相关联?

      val requestsForMaster = shardNames.map { x ⇒
        sentinel ? Request("SENTINEL", "get-master-addr-by-name", x)
      }

我会做这样的事情,把期货变成一个序列

      val mastersConfig = Future.sequence(requestsForMaster)
      mastersConfig.onSuccess {
        case x: List[Some[List[Some[ByteString]]]] ⇒
          self ! x.map {
            case Some(List(Some(host: ByteString), Some(port: ByteString))) ⇒    
              println("Host/port: " + host.utf8String + ":" + port.utf8String)
              Shard("name", host.utf8String, port.utf8String.toInt, None)
          }
      }

但是当我去创建Shard对象时,名称(x)不可用,我需要它。

我是否知道如何将这些名称组合在一起?

编辑: 这是我使用的解决方案:

  val requestsForMaster = shardNames.map { x ⇒
        (sentinel ? Request("SENTINEL", "get-master-addr-by-name", x)).map(y ⇒ (x, y))
      }

      val mastersConfig = Future.sequence(requestsForMaster)
      mastersConfig.onSuccess {
        case x: (List[(String, Some[List[Some[ByteString]]])]) ⇒
          self ! x.map {
            case (name, Some(List(Some(host: ByteString), Some(port: ByteString)))) ⇒

              println("Name Host:port: " + name + " " + host.utf8String + ":" + port.utf8String)
              Shard("name", host.utf8String, port.utf8String.toInt, None)
          }
      }

1 个答案:

答案 0 :(得分:2)

如果我理解正确,听起来您希望在请求期货上使用map将每个回复与分片的名称配对:

val requestsForMaster: List[Future[(String, Some[List[Some[ByteString]])] =
  shardNames.map { x =>
    val result = sentinel ? Request("SENTINEL", "get-master-addr-by-name", x)
    result.map(x -> _)
  }

val mastersConfig = Future.sequence(requestsForMaster)

mastersConfig.onSuccess {
  case results: List[(String, Some[List[Some[ByteString]]])] =>
    self ! results.map {
      case (x, Some(List(Some(host: ByteString), Some(port: ByteString)))) =>
        // Create the shard object.
    }
}

更一般地说,如果您有Future[V]K,则可以通过撰写Future[(K, V)]来创建fv.map(k -> _)