3

我对未来的作曲有点陌生,所以我还没有弄清楚所有常见的模式。

我有一个期货列表,但我需要在创建期货时将名称与期货相关联,以便以某种方式协调该列表。

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)
          }
      }
4

1 回答 1

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.
    }
}

更一般地说,如果你有 aFuture[V]和 a K,你可以Future[(K, V)]通过编写来创建 a fv.map(k -> _)

于 2013-09-18T20:59:26.363 回答