Показать сообщение отдельно
  #1 (permalink)  
Старый 15.12.2017, 01:21
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

Как в 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'));
Ответить с цитированием