2017-09-01 36 views
6

मैं कोणीय 4 का उपयोग कर रहा हूं और मैं 2 अंतराल से डेटा प्राप्त करने का प्रयास करता हूं लेकिन मुझे rxjs को समझने में समस्या है।कोणीय 4 एकाधिक HTTP अनुरोधों से डेटा गठबंधन

इस कोड के साथ मैं केवल छात्रों और उपयोगकर्ताओं की सूची प्राप्त कर सकता हूं।

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

मान लें कि इस डेटा है: छात्र

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

उपयोगकर्ता

[{"ID" : 1 ,"Name": "Rick" , "FamilyName" , "Grimes" }, 
{"ID" : 4 ,"Name": "Carle" , "FamilyName" , "Grimes" }] 

मैं पहली बार सभी छात्रों को तो UserID तुलना प्राप्त करना चाहते हैं अगर यह उपयोगकर्ता के रूप में ही है तो मैं दोनों गठबंधन जब तक मुझे इस तरह की सरणी नहीं मिल जाती तब तक ऑब्जेक्ट्स:

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

मुझे लगता है कि मुझे फ्लैटमैप का उपयोग करना चाहिए, लेकिन मैंने कोड लिखने का प्रयास किया लेकिन यह मेरे लिए काम नहीं कर पाया और मुझे इस तरह के तर्क के साथ कोई उदाहरण नहीं मिला।

क्या आप कृपया मेरी मदद कर सकते हैं।

+0

flatmap आपको धाराओं को बदलने की इजाजत देता है, उदाहरण के लिए, आप छात्रों से पूछ सकते हैं और फिर किसी विशेष छात्र के लिए पाठ्यक्रमों की सूची प्राप्त कर सकते हैं जो एक अच्छा विकल्प होगा n; इस मामले में आपको हमेशा दोनों सूचियों की आवश्यकता होती है और फिर आप कुछ तर्क कर सकते हैं, इसलिए आपको ऐसा करने के लिए फोर्कजोइन, मर्ज या गठबंधन की आवश्यकता हो सकती है – David

उत्तर

2

आप नीचे दिए गए कोड में switchMap ऑपरेटर (flatMap का उपनाम) का उपयोग कर सकते हैं: इस JSBin

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

चेक आउट: http://jsbin.com/batuzaq/edit?js,console

0

आप निम्न की कोशिश कर सकते:

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$; 
    } 
संबंधित मुद्दे