2017-10-06 24 views
2

我正在寻找一些建议最好执行此规定:顺序(事务)API的角度4来电与状态管理

我需要调用3或4个不同的API /终端将用户添加到我们的系统(使用表格)。

  • 第一次调用添加一个用户帐户并返回一个ID。
  • 第二个创建使用 以前的ID
  • 则有可能是一个或两个以上的呼叫根据前面的步骤来创建其他业务 域名记录不同的端点联系人记录。

我已经经历了几个关于多问题读 - 连续的请求:Multiple Sequential API calls in Angular 4

但我想知道如何使收集的调用执行类似的交易,所以如果任何步骤失败(例如,电子邮件正则表达式在步骤2)我可以管理错误,并跟踪我正在进行的步骤,所以我可以继续从那里,而不是从头再来。

我认为我挂和localStorage的答案的组合 - 有没有更好的解决办法?

感谢

回答

2

一般来说,这可以用concatMapdomerge运营商来实现:

this.formSubmit$ 
    .concatMap(formData => this.http.post(...).map(user => user.id)) 
    .do(id => /* save id here */) 
    .merge(this.recoverWithId$) // continue from here if you already have an id 

    .concatMap(id => this.http.post(...)) 
    .do(id => /* save whatever you need here */) 
    .merge(this.recoverWithWhatever$) // continue from here if already have whatever 

    ... 
    .retry() 
    .subscribe() 

如果任何this.http.post的发出错误,它会进一步传播和所有后续步骤将是跳过。这也是为什么我使用retry()之前的原因subscribe().

您也可以使用catch运算符,但它确实取决于您想要实现的行为。

+0

对不起,我的无知 - .merge(this.recoverWithId $)< - 这是一个变量(保存的ID)或指向先前保存的ID的功能?谢谢! –

+1

'this.recoverWithId $'你的情况另一个观察的,最有可能的一个主题,你叫'this.recoverWithId $。接下来(myStoredId)' – martin

+0

嗨马丁,我还是有点困惑合并操作,如果我做.merge(this.recoverWithContactId.next( '123'))不起作用,因为它是一个void方法,甚至.merge(ID => '123')的.concatMap没有收到ID PARAM。我显然会以这种错误的方式去做!我的recoverWithContactId是一个新的Subject(); –