如何更改Observable(RxJs)中的参数

时间:2016-09-08 12:00:04

标签: angular typescript rxjs observers

我在Angular 2中使用HTTP提供程序从API进行数据加载。

return this.http.post(url, urlSearchParams.toString(), {
        headers: this.getHttpHeaders()
    })
    .retryWhen((error) => {
        return this.handleRetryError(error);
    })

当没有或旧会话时,我在this.handleRetryError(错误)中创建新的会话并用它填充标题。 (方法getHttpHeaders()返回带标题的数组)

重试当尝试再次发布此帖子时,但第一轮中有未更改的(旧)标题。

是否有机会从.readyWhen更改http.post的header参数?

非常感谢您的帮助:)

3 个答案:

答案 0 :(得分:1)

你需要包装Observable并重试生成的外部Observable,以便每次再次执行。

https://plnkr.co/edit/nCvaC6vJYEBJYeVENz9N?p=preview

Observable.of(1).mergeMap(x=> {
  return this.http.get('data.json', this.configObject())
  .do(x => throw(x))
  .map(res=>res.json());
})
.retryWhen(e => e.delay(2000))
.subscribe();

代码

return Observable.of(1).mergeMap(x => { 
    return this.http.post(url, urlSearchParams.toString(), {
      headers: this.getHttpHeaders()
    });
  })
  .retryWhen(e => this.handleRetryError(e))

答案 1 :(得分:0)

试试这个:

return Observable
    .defer(() => {
        this.http.post(url, urlSearchParams.toString(), {
            headers: this.getHttpHeaders()
        });
    })
    .retryWhen(errors => {
        this.handleRetryError(errors);
        return errors.delay(200)
    });

答案 2 :(得分:0)

你可以在该函数之外保留对headers变量的引用,然后在retryWhen函数中修改该变量。

let headers = this.getHttpHeaders();

return this.http.post(url, urlSearchParams.toString(), {
    headers: headers
})
.retryWhen((error) => {
    headers.foo = "bar";

    return this.handleRetryError(error);
})