我是反应/观察能力概念的新手。
我已经定义了获取Products
的路线:
GET /products controllers.ProductController.findProducts
以及控制器中的实现:
def findProducts() = secured.async { implicit request =>
productDao.find()
.map(products => Ok(Json.toJson(products)))
// products: List[Product]
.recover(errHandler)
}
然后,在客户端,我正在拨打电话并订阅它:
let sub = this.find()
.subscribe(
products => {
this.products = products;
this.productsBehaviorSubject.next( this.products );
if (!!sub)
sub.unsubscribe();
},
error => console.log("Error fetching units: " + error)
);
我一收到数据,就取消订阅。 (基本上像Promises一样使用它。)
所以我想知道,如果这是正确的方法。我应该在几个回复中返回,而不是在一个响应中返回List[Product]
吗?
def findProducts() = secured.async { implicit request =>
productDao.find()
.map(products => {
products.map(p => Ok(Json.toJson(p))) // haven't tried this yet
})
// products: List[Product]
.recover(errHandler)
}
然后在客户端..也许。:
this.find()
.take( 50 )
.subscribe(
product => {
this.products.push( product )
},
error => console.log("Error fetching units: " + error),
() => this.productsBehaviorSubject.next( this.products )
);
答案 0 :(得分:0)
您的第一种方法是正确的,您会注意到secured.async
期望代码块返回Future[Result]
。因此,如果您尝试映射产品,则签名将为Future[Seq[Result]]
,这将为您提供编译错误。
另外根据我的经验,在单个响应中返回完整列表是标准的编码方式。