Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #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'));
Ответить с цитированием
  #2 (permalink)  
Старый 15.12.2017, 08:00
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как узнать, присутствует ли в окне полоса прокрутки или нет? возжаждавший Элементы интерфейса 6 12.03.2010 23:00
30(1|2) редирект от сервера. Или как лучше сделать редирект при верной отсылке форма. pizzZ AJAX и COMET 2 18.02.2010 09:06
О наследовании событий, или как корректно его отменить. JCShen Events/DOM/Window 8 09.02.2010 00:00
Выпадающие списки и запросы к Базе данных Arzobispo Элементы интерфейса 0 21.11.2008 10:15
Переменная от переменной или как к имени переменной конкатенировать значение другой Aderba jQuery 5 12.11.2008 15:25