Как изменить параметр в Observable (RxJs)

Я использую HTTP-провайдер в Angular 2 для загрузки данных из API.

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

Когда нет или старый сеанс, я создаю новый в this.handleRetryError(ошибка) и заполняю его заголовками. (метод getHttpHeaders() возвращает массив с заголовками)

RetryWhen пытается снова выполнить эту запись, но в первом раунде нет неизмененных (старых) заголовков.

Есть ли шанс изменить параметр заголовков для http.post от .readyWhen?

Большое спасибо за помощь:)

Ответ 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))

Ответ 2

Попробуйте следующее:

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

Ответ 3

Возможно, вы сохраните ссылку на переменную заголовков вне этой функции, а затем измените эту переменную внутри функции retryWhen.

let headers = this.getHttpHeaders();

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

    return this.handleRetryError(error);
})