Javascript-форум (https://javascript.ru/forum/)
-   Angular.js (https://javascript.ru/forum/angular/)
-   -   Как в rxJs делать запросы до получения данных или таймаута? (https://javascript.ru/forum/angular/71819-kak-v-rxjs-delat-zaprosy-do-polucheniya-dannykh-ili-tajjmauta.html)

Shitbox2 15.12.2017 01:21

Как в rxJs делать запросы до получения данных или таймаута?
 
Нужно каждую секунду опрашивать сервер на наличие нужных данных и делать это нужно не больше скольки-то раз или до истечения определенного времени.

Реализовал оба варианта так. Но, учитывая, распространенность задачи, может быть есть более подходящие варианты?
//Имитация запроса
let id = 0
function getData() {
    return Rx.Observable.create(observer => {
    	setTimeout(() => {
      	observer.next({id: id});
        observer.complete({id: id});
        id++
        }, 500);
    })
}

//Ошибка после 10 попыток
Rx.Observable
.timer(0, 1000)
.switchMap((data, i) => i < 10 ? getData() : Rx.Observable.throw('timeout'))
.find(data => data.id === 5)
.subscribe(data => console.log('next', data), error => console.log('error', error), () => console.log('complete'));

//Ошибка после 10 с.
Rx.Observable
.merge(Rx.Observable.timer(0, 1000), Rx.Observable.never().timeout(10000))
.switchMap(() => getData())
.find(data => data.id === 5)
.subscribe(data => console.log('next', data), error => console.log('error', error), () => console.log('complete'));

destus 15.12.2017 08:00

Shitbox2,
function sendRequest(val, until) {
      let chaining = Rx.Observable.timer(0, 1000).switchMap(getData);
      chaining = until ? chaining.takeUntil(Rx.Observable.timer(val)) : chaining.take(val);
      return chaining
        .find(data => data.id === 5)
        .switchMap(data => data ? Rx.Observable.of(data) : Rx.Observable.throw('timeout'))
}
//Ошибка после 10 попыток
    sendRequest(10)
      .subscribe(data => console.log('next', data), error => console.log('error', error), () => console.log('complete'));
//Ошибка после 10 с.
    sendRequest(10000, true)
      .subscribe(data => console.log('next', data), error => console.log('error', error), () => console.log('complete'));


Часовой пояс GMT +3, время: 07:13.