我有一个代表数据库记录的字符串 id 列表。我想从数据库异步加载它们,然后将每条记录异步上传到远程服务器,然后当所有上传完成后,记录上传记录的 ID。
由于我使用的是 Scala 2.9.2,因此我使用的是 Twitter 的 core-util Future 实现,但它在 Monadic 转换方面应该与 2.10 的 future 完全一样。
一般概念是这样的:
def fetch(id: String): Future[Option[Record]]
def upload(record: Record): Future[String]
def notifyUploaded(ids: Seq[String]): Unit
val ids: Seq[String] = ....
我试图通过理解来做到这一点,但 fetch 返回选项的未来这一事实使它变得模糊并且代码无法编译:
for {
id <- ids
maybeRecord <- fetch(id)
record <- maybeRecord
uploadedId <- upload(record)
} yield uploadedId
编译它会导致以下错误:
scala: type mismatch;
found : com.twitter.util.Future[String]
required: Option[?]
uploadedId <- upload(record)
^
我错过了什么?为什么编译器期望 uploadId 是一个选项?有什么漂亮的方法可以解决这个问题吗?