我的firebase中有以下数据结构
- ActionSheet
- PendingApproval
- SomeKey1
- user: 1
- data: 'walk the dog'
- SomeKey2
- user: 2
- data: 'brush the cat'
- Approved
- SomeKey3
- user: 1
- data: 'feed fish'
我想在此结构中下载用户1的所有数据,以便我可以向用户显示“遛狗”和“喂鱼”
目前我就是这样做的。我正在“链接”这些呼叫,以便第二个呼叫在第一个呼叫完成之前不会启动。
ngOnInit() {
this.databaseService.searchCurrentUserPendingApproval()
.first()
.subscribe(results => {
for (let result of results) {
this.mySubmissions.push(result);
}
this.databaseService.searchCurrentUserApprovedAction()
.first()
.subscribe(results => {
for (let result of results) {
this.mySubmissions.push(result);
}
// do some logic to the this.mySubmissio array at this point
doSomething(this.mySubmission);
}, error => {
console.log('Error download Actioned Timesheet', error)
})
}, error => {
console.log('error retreiving pending submission from firebase', error)
})
}
searchCurrentUserPendingTimesheets(key: string) {
let path = '/ActionSheet/PendingApproval' + key;
return this.af.database.list(path, {
query: {
orderByChild: 'user',
equalTo: 1
}
})
}
// search for own timesheet in firebase
searchCurrentUserActionedTimesheets(key: string) {
let path = '/ActionSheet/Approved' + key;
return this.af.database.list(path, {
query: {
orderByChild: 'user',
equalTo: 1
}
})
}
这很有效。然而,最大的问题是,这是一种可怕的做法,对于更大的“链条”来说,这将是缓慢的。 由于这两个查询不相互依赖,更好的方法是同时查询两个分支,并在两个操作完成时得到通知(无论哪个首先回来,因为我将在末尾对数组进行排序')。
换句话说,一旦完成所有异步调用,我想运行doSomething(this.mySubmission)。是否有适当的打字方式来实现这一目标?
请注意。当我使用Swift时,我能够通过dispath_group_enter / dispatch_group_leave实现此目的。
答案 0 :(得分:1)
您可以使用forkJoin等待多个可观察对象。
答案 1 :(得分:1)
您可以尝试使用forkJoin,如下所示:
Observable.forkJoin(
this.databaseService.searchCurrentUserPendingApproval().first(),
this.databaseService.searchCurrentUserApprovedAction().first()
).subscribe([pendingResults, approvedResults] => {
this.mySubmissions = this.mySubmissions.concat(pendingResults, approvedResults);
doSomething(this.mySubmissions);
}, error => console.log('Error download Actioned Timesheet', error))