Как изменить параметр в 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);
})