【问题标题】:Angular rxjs sets of sequential http callsAngular rxjs 的顺序 http 调用集
【发布时间】:2018-04-19 19:34:40
【问题描述】:

我正在编写一个函数,使用 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))
}

正如您在上面看到的,我使用的是 Portfolio[0],显然我需要为 addAccountRequest 和 addInvestorAccountRequest 迭代投资组合

谢谢!

【问题讨论】:

    标签: angular typescript rxjs observable


    【解决方案1】:

    我认为你在使用 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 -> in parallel (addAccountRequest -> addInvestorAccount Request)

    显然有很多请求正在发出。如果可能,我建议更新您的 HTTP 请求以一次接受多个投资组合/帐户。但如果这不是一个选项,这将是完成链式序列的一种方式。

    【讨论】:

    • 嗨,LLai,我认为(甚至没有实现)这看起来会起作用 - 缺失的部分将其分解为一个函数,该函数保留每个投资组合的所有上下文 - 我会回复你,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 2020-03-26
    相关资源
    最近更新 更多