Reputation: 3604
I've an Angular app using angularfire2 and I'm using a method which removes some information from a few different tables in firebase.
removeTeam(key: string) {
const dataToRemove = {};
dataToRemove[`teams/${key}`] = null;
this.findMembersInTeam(key).subscribe(members => {
members.forEach(member => {
dataToRemove[`members/${member}/teams/${key}`] = null;
});
this.sdkDB.update(dataToRemove);
});
}
So what this does, basically is remove /teams/ and also, for every member in the team, remove the team, so remove /members//teams/.
What I do is retrieve the list of members inside a team, and as this is an observable, inside the subscribe I compose the "query" and execute it with this.sdkDB.update(dataToRemove)
This last method returns a Promise, and that is what I want to return as the result of the method removeTeam
, is there a way to do that?
Thanks
Upvotes: 4
Views: 6850
Reputation: 9873
IF sdkDB
returns an Observable, import rxjs/add/operator/mergeMap
and use flatMap
or mergeMap
(flatMap is just an alias of mergeMap) instead of subscribe
.
This combines your observable streams.
removeTeam(key: string) {
const dataToRemove = {};
dataToRemove[`teams/${key}`] = null;
return this.findMembersInTeam(key)
.flatMap(members => {
members.forEach(member => {
dataToRemove[`members/${member}/teams/${key}`] = null;
});
return this.sdkDB.update(dataToRemove);
})
.toPromise();
}
Upvotes: 4
Reputation: 13356
Try this:
import 'rxjs/add/operator/toPromise';
// ...
removeTeam(key: string) {
const dataToRemove = {};
dataToRemove[`teams/${key}`] = null;
return this.findMembersInTeam(key)
.toPromise()
.then(members => {
members.forEach(member => {
dataToRemove[`members/${member}/teams/${key}`] = null;
});
return this.sdkDB.update(dataToRemove);
});
}
Upvotes: 1