A. Pine
A. Pine

Reputation: 331

angularfirebase2 list query returning undefined

I must be seriously misunderstanding something with RxJs and AngularFirebase2 because I can't figure out this error.

I have a firebase list that I am querying with a function in a service like so:

 returnAuthor(id) {
    this.db.list('/flamelink/users', ref => ref.orderByChild('id').equalTo(id)).valueChanges().subscribe(data => { console.log(data); return data })
}

The console.log(data) in returnAuthor produces the correct data, but {{ returnAuthor(id) }} in my template returns undefined. Running returnAuthor in my component also returns undefined.

Can somebody please point me in the right direction here? Do I need to subscribe in the component and not the service?

Upvotes: 0

Views: 74

Answers (1)

Alf Moh
Alf Moh

Reputation: 7427

Your method returns undefined because you are not returning a result from the function. To return a result, your function will look like this

returnAuthor(id) {
  return this.db.list('/flamelink/users', ref => ref.orderByChild('id').equalTo(id)).valueChanges().subscribe(data => { console.log(data); return data })
}

But returning like that will return a subscription not the data. If you want the data from the subscription, you can declare a variable and set the data returned from the subscription to it. Something like this

in your class

dataVariable;

    returnAuthor(id) {
      this.db.list('/flamelink/users', ref => ref.orderByChild('id').equalTo(id)).valueChanges().subscribe(data => { console.log(data); this.dataVariable = data })
    }

Now the data available from the subscription will be passed onto the dataVariable that you can use.

In case you want to pass the data to another method when it arrives, you can call the method in the subscription. Something like this

returnAuthor(id) {
   this.db.list('/flamelink/users', ref => ref.orderByChild('id').equalTo(id)).valueChanges().subscribe(data => { console.log(data); anotherMethod(data); })
}

Upvotes: 2

Related Questions