获取新票然后重试第一个请求

时间:2016-10-10 07:42:32

标签: angular rxjs observable

更新

我扩展了Http类,当我{ 'node': {'changeset': '11129782', 'uid': '451048', 'timestamp': '2012-03-28T18:31:23Z', 'lon': '-87.6866303', 'visible': 'true', 'version': '7', 'user': 'bbmiller', 'lat': '41.9730791', 'id': '261114295'}, 'bounds': {'minlat': '41.9704500', 'maxlon': '-87.6894800', 'minlon': '-87.6928300', 'maxlat': '41.9758200'} } 我想要处理错误然后deleteDocument()然后用新的getTicket()重试ma请求deleteDocument()

this.TICKET

收到我的新票后,我想用新网址重试我的第一个请求。感谢

1 个答案:

答案 0 :(得分:0)

我不知道是否有更简单的方法,但我使用concatMap()运算符,并使用前一次调用返回的id递归调用deleteDocument()

这应该模拟你的情况:

import {Observable} from 'rxjs';

function deleteDocument(willFail: bool, id) {
  return Observable.of("I'm your response: " + id)
    // process response and eventualy throw error
    .concatMap(val => {
      if (willFail) {
        return Observable.throw({response: val, message: "It's broken"});
      } else {
        return Observable.of(val);
      }
    })
    // recover from the error
    .catch(initialError => {
      return deleteDocument(false, initialError.response.length);
    });
}

deleteDocument(true, 42).subscribe(result => console.log(result));

查看现场演示:http://plnkr.co/edit/rUbLgEwtw7lSBueKJ5HN?p=preview

打印到控制台:

I'm your response: 21

我正在使用willFail参数模拟错误。运算符concatMap服务器在此区分错误和正确的响应。我也传递原始的id并进行一些处理,仅用于演示目的。

在您的情况下,您还会向intercept()追加重建原始HTTP请求所需的所有参数,而不是this.getTicket().do()使用:

return this.getTicket().concatMap(response => {
    var newBody = {id: response.ticketId};
    return this.post(originalUrl, newBody, ...);
});

运算符do()对于调试运算符链中的内容非常有用,它不会以任何方式修改链。

我不知道你的代码实际上做了什么,但我希望这对你有意义。

也许你的问题类似:Observable Continue calling API and changing parameters based on condition