Я создаю интерактивную веб-страницу с RxJs.Как я могу превратить наблюдаемый в наблюдаемые длинные наблюдательные наблюдения, которые заканчиваются на определенную ценность?
Это то, что я хочу добиться:
У меня есть приложение, которое генерирует маркеры. Эти токены могут потребляться внешним объектом.
Когда пользователь создает токен, страница начинает опрос веб-сервера по его статусу (потребляется или нет). Когда токен потребляется, страница обновляется.
Итак, когда маркер создан, каждые 2 секунды на сервер отправляется запрос о том, потребляется ли токен.
У меня есть Observable
строк, которые представляют собой мои generatedTokens
.
У меня уже есть рабочая реализация с использованием класса Rx.Scheduler.default, который позволяет мне делать что-то вручную. Тем не менее, я не могу не чувствовать, что должно быть намного проще и элегантнее.
Это текущий код:
class TokenStore {
constructor(tokenService, scheduler) {
// actual implementation omitted for clarity
this.generatedTokens = Rx.Observable.just(["token1", "token2"]);
this.consumedTokens = this.generatedTokens
.flatMap(token =>
Rx.Observable.create(function(observer) {
var notify = function() {
observer.onNext(token);
observer.onCompleted();
};
var poll = function() {
scheduler.scheduleWithRelative(2000, function() {
// tokenService.isTokenConsumed returns a promise that resolves with a boolean
tokenService.isTokenConsumed(token)
.then(isConsumed => isConsumed ? notify() : poll());
}
);
};
poll();
}));
}
}
Есть ли что-то вроде метода "RepeatUntil"? Я ищу для реализации, что делает то же самое, что и выше код, но выглядит примерно так:
class TokenStore {
constructor(tokenService, scheduler) {
// actual implementation omitted for clarity
this.generatedTokens = Rx.Observable.just(["token1", "token2"]);
this.consumedTokens = this.generatedTokens
.flatMap(token =>
Rx.Observable.fromPromise(tokenService.isTokenConsumed(token))
.delay(2000, scheduler)
// is this possible?
.repeatUntil(isConsumed => isConsumed === true));
}
}
Просто интересно, почему вы применяете длительный опрос. Почему бы не использовать node.js с socket.io или что-то еще? –
На самом деле мы начали с SignalR (мы работаем на сервере .NET), но так как мы столкнулись с некоторыми проблемами сложности и проблемами с сетью (наши проекты обычно развертываются внутри DMZ), мы прибегаем к длительному опросу, чтобы уменьшить сложность и улучшить тестируемость. SignalR также был серьезным препятствием для теста интеграции правильно, и в итоге просто не стоило этого. – Moeri