2017-08-20 4 views
1

私は反応性/オブザーバブルの概念を初めて使いました。再生フレームワーク - データのリストを返す適切な方法は何ですか?

は、私はこのような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のように使用します)。
これは正しい方法だと思います。 1つの応答で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

あなたの最初のアプローチが正しい、あなたはsecured.asyncは、コードブロックがFuture[Result]を返すように期待していることがわかります。したがって、製品をマップすると、署名はFuture[Seq[Result]]となり、コンパイルエラーが発生します。

私の経験では、単一の応答で完全なリストを返すことが、標準的なコード作成方法です。

関連する問題