Angular 角度rxjs连续http调用集
我正在使用concatMap编写一个函数来按顺序进行HTTP调用,例如添加一个人,使用返回的一些信息添加联系人,然后添加一些帐户 该函数接收一个列表(在我的例子中是公文包),对于每个公文包,我需要创建对addAccount和addInvestorAccount的调用 例如,两个公文包需要两组对这些端点的调用(addInvestorAccount取决于addAccount的结果) 我不确定如何创建这些动态HTTP调用集并将它们附加到当前流。我已经研究过forkJoin,但这似乎是针对独立的并行调用的 希望这有点道理,这里有一些演示代码:Angular 角度rxjs连续http调用集,angular,typescript,rxjs,observable,Angular,Typescript,Rxjs,Observable,我正在使用concatMap编写一个函数来按顺序进行HTTP调用,例如添加一个人,使用返回的一些信息添加联系人,然后添加一些帐户 该函数接收一个列表(在我的例子中是公文包),对于每个公文包,我需要创建对addAccount和addInvestorAccount的调用 例如,两个公文包需要两组对这些端点的调用(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的公文包
谢谢 我认为您使用forkJoin的方法是正确的。可以对串联的调用进行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数量的链接投资组合请求。现在,在您最初的方法中,创建一个包含您需要的所有投资组合的数组
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
->emailContactRequest
->(addAccountRequest->addInvestorAccount Request)
很明显,人们提出了很多要求。如果可能的话,我建议更新您的HTTP请求以同时接受多个公文包/帐户。但是,如果这不是一个选项,这将是一种完成链接序列的方法。嗨,我想(甚至没有实现)这看起来是可行的-缺少的部分是将其分解成一个函数,保留每个投资组合的所有上下文-我会给你回复,非常感谢!