2017-08-20 1 views
1

Je suis nouveau dans le concept réactif/observables.jouer cadre - quelle est la bonne façon de retourner la liste des données?

J'ai défini un itinéraire pour se Products comme ceci:

GET /products controllers.ProductController.findProducts

et la mise en œuvre dans le contrôleur:

def findProducts() = secured.async { implicit request => 
    productDao.find() 
    .map(products => Ok(Json.toJson(products))) 
    // products: List[Product] 
    .recover(errHandler) 
} 

Ensuite, sur le côté client, je suis faire l'appel et vous y abonner comme ceci:

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) 
); 

Dès que j'obtiens les données, je me désinscrit de celles-ci. (essentiellement l'utiliser comme promesses).
Je me demande donc si c'est la bonne façon de le faire. Au lieu de retourner List[Product] dans une seule réponse, devrais-je retourner dans plusieurs réponses ??

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) 
} 

puis sur le côté client .. peut-être.

this.find() 
    .take(50) 
    .subscribe(
    product => { 
     this.products.push(product) 
    }, 
    error => console.log("Error fetching units: " + error), 
    () => this.productsBehaviorSubject.next(this.products) 
); 

Répondre

0

Votre première approche est correcte, vous remarquerez que le secured.async attend le bloc de code pour revenir Future[Result]. Donc, si vous essayez de mapper sur les produits alors la signature sera Future[Seq[Result]] qui vous donnera une erreur de compilation. Dans mon expérience, retourner la liste complète dans une seule réponse est la manière standard de coder.