2016-10-20 2 views
0

У меня есть следующий метод:Угловые 2 исполняющие наблюдаемые в серии

getProject(name) { 
    this.ProjectName = name; 
    //Friendly URL to ID --> FIRST OBSERVABLE 
    this.af.database.object('/friendly_urls/' + name).take(1).share().map((data) => { 
    //ID to data --> SECOND OBSERVABLE 
    this.af.database.object('/Project/' + data.$value).take(1).map((ProjectData) => { 
     console.log("Received Project data"); 
     this.ProjectData = ProjectData; 
    }); 
    }, 
    error => { 
    console.log(error); 
    /* TODO: Permission blocked page */ 
    this.router.navigate(['']); 
    }); 
} 
} 

У меня есть 2 наблюдаемыми: Первый наблюдаемым, который выполняется первым, и второй - который выполняется сразу же после него.

Я попытался понять, как использовать this в моем случае и не мог понять это.

Как я могу выполнять эти наблюдаемые в серии без видимых внутри наблюдаемых?

ответ

1

Использование switchMap принимать значение от первого наблюдаемого и использовать его в качестве затравки к второму наблюдению. Во-первых вы настроите (сочинить) поток:

projectData$ = this.af.database.object('/friendly_urls/'+name).share().switchMap(
    data => this.af.database.object('/Project/'+data.$value) 
).take(1); 

Затем, когда вы хотите, чтобы вытащить данные, просто subscribe:

projectData$.subscribe(
    projectData => this.ProjectData = projectData, 
    error => console.log(error); 
) 

More about switchMap

+0

Привет, спасибо! Но если я подпишусь на 'projectData $', переменная '' ProjectData' будет наблюдаться 'this.af.database.object ('/ Project /' + data. $ Value)', а не фактическая информация, которая мне нужна (которая это подписка на это наблюдение) – Elikos

+0

Это приводит к тому, что мне нужно сделать 2 подписки так же, как и один за другим. 'ProjectData.subscribe ((data) => {this.RealProjectData = data});' – Elikos

+0

@Elikos Я знаю, что 'database.object' возвращает Observable. Вот почему я использую 'switchMap' вместо' map'. Вы уже пробовали мое решение, и это не сработало или вы прогнозируете, что произойдет? – BeetleJuice

1

Вы должны использовать статический оператор concat, который подписывается на первый наблюдаемый и после завершения на второй.

let obs1 = this.af.database.object('/friendly_urls/' + name).map(data => data.$value); 
let obs2 = this.af.database.object('/Project/' + data.$value).map(project => this.ProjectData = project); 

let concatenatedObservables = Observable.concat(obs1, obs2); 

concatenatedObservables.subscribe(); 

Более подробно о том, что здесь http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-concat

+1

Не уверен, что это будет работать, вам нужно значение из первого наблюдаемый для выполнения 2-го ... – Sasxa

+1

Это не сработает. b/c автор использует 'data', возвращенные из obs 1, в качестве входных данных для obs 2.' concat' запускает два в независимых контекстах. – BeetleJuice

Смежные вопросы