2017-02-12 68 views
1

我有我的火力執行多個異步操作(打字稿)

- 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 
     } 
    }) 
} 

This works。然而,最大的問題在於,這是一種可怕的方式,對於較大的「連鎖」來說,速度會很慢。 由於兩個查詢並不相互依賴,所以更好的方法是同時查詢兩個分支,並在兩個操作完成時得到通知(無論哪個先返回爲我將在最後對數組進行排序')。

換句話說,一旦完成所有提到的異步調用,我想運行doSomething(this.mySubmission)。有沒有適當的打字方式來達到這個目的?

注意。當我使用Swift時,我可以通過dispath_group_enter/dispatch_group_leave實現這一點。

+0

什麼'Promise.all()'?這不是打字稿特定的,但你提到的是它的確切用例 – aarosil

回答

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