2017-11-07 14 views
0

私はconcatMapを使って関数を書いて、HTTP呼び出しを連続して行います。人を追加し、返された情報を使用して連絡先を追加し、いくつかのアカウントを追加します。順次http呼び出しの角度rxjsセット

この関数はリスト(私の場合はポートフォリオ)を受け取り、各ポートフォリオに対してaddAccountとaddInvestorAccountの呼び出しを作成する必要があります。

2つのポートフォリオは、これらのエンドポイントへのコールの二組を必要とする例えばので(addInvestorAccountはのaddAccountの結果に依存している)

私はHTTP呼び出しのこれらの動的セットを作成し、それらを接続する方法がわかりませんよ現在のストリーム。私はforkJoinを見てきましたが、これは独立した並列呼び出しのようです。

AddPerson(person: Person, portfolios: Portfolio[]) { 
const addPerson = new AddPersonRequest(); 
// additional request props 
return this.hostSvc.put(addPersonRequest) 
    .concatMap((response: Person) => { 
     const emailContactRequest = new CreateContactRequest(); 
     emailContactRequest.PersonId = response.Id; 
     // additional request props 
     return this.hostSvc.put(emailContactRequest) 
    }) 
    .concatMap((response: AccountName) => { 
     const addAccountRequest = new AddAccountRequest(); 
     addAccountRequest.Data = new Account(); 
     addAccountRequest.Data.AccountId = response.Id 
     addAccountRequest.Data.PortfolioId = portfolios[0].Id 
     // additional request props 

     return this.hostSvc.put(addAccountRequest); 
    }) 
    .concatMap((response: Account) => { 

     const addInvestorAccountRequest = new AddInvestorAccountRequest(); 
     addInvestorAccountRequest.Data = new InvestorAccount(); 
     addInvestorAccountRequest.Data.AccountType = response.AccountType 
     // additional request props 
     return this.hostSvc.put(addInvestorAccountRequest); 
    }, (error) => console.log(error)) 
} 

あなたは[0]、明らかに私は

addAccountRequestとaddInvestorAccountRequestのためのポートフォリオを反復処理する必要があり、私はポートフォリオを使用している上で見ることができるように:

ホープこれは、いくつかの理にかなって、ここにいくつかのデモコードです

ありがとう!

答えて

2

私はあなたがforkJoinで正しい軌道にいると思います。直列に並んでいるfork(並列)コールを実行できます。私はあなたの2つの依存する呼び出しをチェーンする別のメソッドを作成します。

makePortfolio(accountName: AccountName, portfolio: Portfolio){ 
    const addAccountRequest = new AddAccountRequest(); 
    addAccountRequest.Data = new Account(); 
    addAccountRequest.Data.AccountId = accountName.Id 
    addAccountRequest.Data.PortfolioId = portfolio.Id; 

    return this.hostSvc.put(addAccountRequest) 
     .concatMap((response: Account) => { 
      const addInvestorAccountRequest = new AddInvestorAccountRequest(); 
      addInvestorAccountRequest.Data = new InvestorAccount(); 
      addInvestorAccountRequest.Data.AccountType = response.AccountType 
      // additional request props 
      return this.hostSvc.put(addInvestorAccountRequest); 
     }); 
} 

これは、x個の連鎖ポートフォリオ要求を行うために使用されます。要求の多くが行われている明らかに>in parallel (addAccountRequest -> addInvestorAccount Request)

- >emailContactRequest - 今、あなたのオリジナルのメソッド内で、すべてのポートフォリオの配列を作るあなたは

AddPerson(person: Person, portfolios: Portfolio[]) { 
    const addPerson = new AddPersonRequest(); 
    // additional request props 
    return this.hostSvc.put(addPersonRequest) 
     .concatMap((response: Person) => { 
      const emailContactRequest = new CreateContactRequest(); 
      emailContactRequest.PersonId = response.Id; 
      // additional request props 
      return this.hostSvc.put(emailContactRequest) 
     }) 
     .concatMap((response: AccountName) => { 
      // build out all portfolio requests 
      let portfolioObservables = portfolios.map((portfolio: Portfolio) => { 
       return this.makePortfolio(response, portfolio); 
      } 

      // make portfolio requests in parallel 
      return Observable.forkJoin(...portfolioObservables); 
     }); 
} 

だから効果的に何が起こっているかaddPersonRequestsである必要があります。可能であれば、複数のポートフォリオ/アカウントを一度に受け入れるようにHTTPリクエストを更新することをお勧めします。しかし、それがオプションでない場合、これは連鎖配列を達成する方法になります。

+0

こんにちは私は(実装しなくても)これはうまくいくように思えます。欠けている部分は、各ポートフォリオのすべてのコンテキストを保持する関数に分割されています。 –

+1

は魅力的に働いた - 素晴らしい:) –

関連する問題