2017-09-01 16 views
6

Köşeli 4 kullanıyorum ve 2 uç noktadan veri almaya çalışıyorum ancak rxjs'yi anlamakta sorun yaşıyorum.Köşeli 4 birden fazla HTTP isteğindeki verileri birleştirin

Bu kodla sadece öğrencilerin ve kullanıcıların listesini alabiliyorum.

getStudent() { 
    return this.http.get(this.url + this.student_url, this.getHeaders()).map(res => res.json()); 
    } 

getUsers() { 
    return this.http.get(this.url + this.users_url, this.getHeaders()).map(res => res.json()); 
    } 

bu veridir Diyelim ki: Öğrenci

[{"ID" : 1 , "SchoolCode": "A150", "UserID": 1 }, 
{"ID" : 5 , "SchoolCode": "A140" , "UserID": 3}, 
{"ID" : 9 , "SchoolCode": "C140" , "UserID": 4}] 

Kullanıcı

sonra ben de birleştirmek o kullanıcıyla aynı bile olsa her şeyden önce öğrencilerin sonra kullanıcı kimliği karşılaştırmak almak istiyorum
[{"ID" : 1 ,"Name": "Rick" , "FamilyName" , "Grimes" }, 
{"ID" : 4 ,"Name": "Carle" , "FamilyName" , "Grimes" }] 

Bu şekilde bir dizi elde edene kadar bir nesneye dönüşür:

{"ID" : 1 , "SchoolCode": "A150","Name": "Rick" , "FamilyName" , "Grimes" } 

Sanırım flatmap kullanmalıyım ama kod yazmayı denedim ama benim için işe yaramadı ve böyle bir mantıkla ilgili bir örnek bulamadım.

Lütfen bana yardımcı olabilir misiniz?

+0

flatmap Örneğin akışları değiştirmenize izin verir, örneğin, öğrenciler için sorabilir ve daha sonra iyi bir optio olacak belirli bir öğrencinin ders listesini alabilirsiniz. n; bu durumda her zaman her iki listeye de ihtiyacın var ve sonra biraz mantık yapabilirsin, bu yüzden bunu yapmak için çatalla birleşebilir, birleştirebilir veya birleştirebilirsin – David

cevap

2

Aşağıdaki kodda switchMap operatörü (flatMap ait takma ad) kullanabilirsiniz:

// Observables mocking the data returned by http.get() 
const studentObs = Rx.Observable.from([ 
    {"ID" : 1 , "SchoolCode": "A150", "UserID": 1 }, 
    {"ID" : 5 , "SchoolCode": "A140" , "UserID": 4}, 
    {"ID" : 9 , "SchoolCode": "C140" , "UserID": 3} 
]); 
const userObs = Rx.Observable.from([ 
    {"ID" : 1, "Name": "Rick" , "FamilyName": "Grimes" }, 
    {"ID" : 3, "Name": "Tom" , "FamilyName": "Cruise" }, 
    {"ID" : 4, "Name": "Amy" , "FamilyName": "Poehler" } 
]); 
// Return an observable emitting only the given user. 
function getUser(userID) { 
    return userObs.filter(user => user.ID === userID); 
} 

studentObs 
    .switchMap(student => { 
    return getUser(student.UserID).map(user => { 
     // Merge the student and the user. 
     return Object.assign(student, {user: user}); 
    }) 
    }) 
    .subscribe(val => console.log(val)); 

Kontrol dışarı bu JSBin: http://jsbin.com/batuzaq/edit?js,console

0

Aşağıdaki deneyebilirsiniz:

import { forkJoin } from 'rxjs/observable/forkJoin'; 

interface Student { 
    id: number; 
    schoolCode: string; 
    userId: number; 
} 

interface User { 
    id: number; 
    name: string; 
    familyName: string; 
} 

interface Merged { 
    id: number; 
    schoolCode: string; 
    name: string; 
    familyName: string; 
} 

getStudents(): Observable<Student[]> { 
    // Implementation 
    } 

    getUsers(): Observable<User[]> { 
    // Implementation 
    } 

    getMerged(): Observable<Merged[]> { 
    const student$ = this.getStudents(); 
    const users$ = this.getUsers(); 
    const merged$ = forkJoin(student$, users$) 
     .map(src => src[0].reduce((acc, current) => { 
     // acc is the accumulated result (list with mapped objects) 
     // current is an element of the students list 
     const user = src[1].find(u => u.id === current.userId); 
     // check if there is a user associated to the current student element 
     if (user) { // if there is a matching user, push new element to result list 
      acc.push({ 
      id: user.id, 
      name: user.name, 
      familyName: user.familyName, 
      schoolCode: current.schoolCode 
      }); 
     } 
     return acc; 
     // this could be changed to use a more immutable based approach 
     }, new Array<Merged>())); 
     // the seed value to start accumulating results is an empty list 
    return merged$; 
    } 
İlgili konular