4

Мне нужно подписаться несколько раз, чтобы получить правильные данные из моей базы данных NoSQL. Для того, чтобы получить список пользователей конкретного проекта, я делаю это:Подписка на множественные наблюдаемые

ngOnInit() { 
    //Subscription 1 (Service): Get project data 
    this.projectService.getCurrentproject().take(1).subscribe(projectData => { 
     console.log('Got project data.'); 
     //Subscription 2: Get project user IDS 
     this.af.database.list('/project_roles/'+projectData.$key) 
      .subscribe((userMeta) => { 
       }); 
      }); 
} 
  • Как вы можете видеть, подписку, внутри подписки, внутри подписки .. И каждая подписка зависит от предыдущего одной reslt ,

  • Подписки 3 и 4 могут быть параллельными.

код работает хорошо, но я что-то отсутствует или это, как я полагаю, работает с несколькими подписки, что результат предыдущего зависит следующий?

Обновление: Проблема связана с подпиской №2. Подписка еще не завершена, но я начинаю перебирать список, который дает мне двойной список пользователей!

+0

Проверили ли вы 'оператор flatMap'? http://stackoverflow.com/questions/36712659/angular-2-two-backend-service-calls-on-success-of-first-service/36712707#36712707 – echonax

+0

Не знаете, в чем разница между тем, что я сделал, и 'flatMap ', или как использовать его с моими 4 подписками |: – Reni

ответ

0

Попробуйте это.

ngOnInit() { 
    this.projectService.getCurrentproject().take(1) 
     .flatMap(projectData => { 
      return this.af.database.list('/project_roles/'+projectData.$key) 
     }) 
     .flatMap(userMeta => { 
      let subs = userMeta.map(projectRole => { 
       return Observable.zip([ 
        this.af.database.object('/roles/'+projectRole.$value), 
        this.af.database.object('/users/'+projectRole.$key) 
       ]).map(([roleData, user]) => { 
        user.role = roleData.$value; 
        return Observable.of(user) 
       }) 
      }); 
      return Observable.zip(subs) 
     }) 
     .subscribe(users => { 
      this.users = users 
     }) 
} 

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

+0

Интересно. Это намного лучше организовано, но не работает. Я исследовал его, и переменные 'userMeta' - это хорошо, но после него ничего не выполняется (размещаются журналы консоли везде, и они не отображаются). наблюдаемые слияния не выполняются. – Reni

+0

нашел ошибку ... исправил ее. карта должна вернуть Observable.of (пользователя) вместо пользователя. Observable.zip ожидает наблюдаемого массива –

+0

Я действительно не знаю, почему, но код после 'map ((roleData, user) => {' не выполняется вообще, это означает, что 'return Observable.of (user)' никогда не ошибок нет. – Reni