Angular 角度rxjs连续http调用集

Angular 角度rxjs连续http调用集,angular,typescript,rxjs,observable,Angular,Typescript,Rxjs,Observable,我正在使用concatMap编写一个函数来按顺序进行HTTP调用,例如添加一个人,使用返回的一些信息添加联系人,然后添加一些帐户 该函数接收一个列表(在我的例子中是公文包),对于每个公文包,我需要创建对addAccount和addInvestorAccount的调用 例如,两个公文包需要两组对这些端点的调用(addInvestorAccount取决于addAccount的结果) 我不确定如何创建这些动态HTTP调用集并将它们附加到当前流。我已经研究过forkJoin,但这似乎是针对独立的并行调用

我正在使用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请求以同时接受多个公文包/帐户。但是,如果这不是一个选项,这将是一种完成链接序列的方法。

嗨,我想(甚至没有实现)这看起来是可行的-缺少的部分是将其分解成一个函数,保留每个投资组合的所有上下文-我会给你回复,非常感谢!