2017-11-07 2 views
0

나는 concatMap을 사용하여 HTTP 호출을 순차적으로 만들기 위해 함수를 작성하고 있습니다. 사람을 추가하고, 정보를 사용하여 연락처를 추가 한 후 일부 계정을 추가하십시오.순차적 HTTP 호출의 각도 rxjs 집합

이 함수는 목록 (내 포트폴리오의 경우)을 받고 각 포트폴리오에 대해 addAccount 및 addInvestorAccount에 대한 호출을 만들어야합니다.

그래서 예를 들어 두 개의 포트폴리오

내가 HTTP 호출이 동적 세트를 만드는 방법을 확실 해요과에 첨부 (addInvestorAccount이 addAccount의 결과에 따라 달라집니다)이 엔드 포인트에 대한 호출의 두 세트를 필요로 현재 스트림. 나는 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으로 올바른 길을 가고 있다고 생각합니다. 직렬로 연결된 통화를 병렬로 시작할 수 있습니다. 나는 당신의 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

는 매력처럼 작동했습니다 - 대단한 :) –