播放框架 - 返回数据列表的正确方法是什么?

时间:2017-08-20 15:57:12

标签: scala playframework

我是反应/观察能力概念的新手。

我已经定义了获取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 )
  );

1 个答案:

答案 0 :(得分:0)

您的第一种方法是正确的,您会注意到secured.async期望代码块返回Future[Result]。因此,如果您尝试映射产品,则签名将为Future[Seq[Result]],这将为您提供编译错误。

另外根据我的经验,在单个响应中返回完整列表是标准的编码方式。