假设您的JsValue 对象有一个“id”字段,您可以编写一个查询Flow,它将接收原始JsValue 并生成原始和数据库版本的元组:
def dbQuery(id : String) : JsValue = ???
val queryFlow : Flow[JsValue, (JsValue,JsValue), _] =
Flow[JsValue] map { originalJs =>
originalJs -> dbQuery((originalJs \ "id").as[String])
}
这些元组可以传递到一个不同的Flow:
def diffJs(original : JsValue, dbVersion : JsValue) : JsValue = ???
val diffFlow : Flow[(JsValue, JsValue), JsValue, _] =
Flow[(JsValue, JsValue)] map diffJs.tupled
你提到的最后一部分是一个数据库,它将保持差异,this can represented 和Sink:
val dbSink : Sink[JsValue, _] = ???
然后可以根据您的值源组合所有这些组件以形成流:
val jsSource : Source[JsValue, _] = ???
jsSource via queryFlow via diffFlow runWith dbSink
有关异步数据库查询的示例,请参阅 this example 演示 mapAsync。