在所有这些操作完成时收到通知,执行多个异步操作(Typescript)

时间:2017-02-12 04:45:20

标签: javascript angular typescript

我的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实现此目的。

2 个答案:

答案 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))