Я борюсь с конкретным сценарием, для которого я надеялся использовать RxJS:
Есть две наблюдаемые, которые должны сработать последовательно для значения, которое будет зарегистрировано:
Наблюдаемая, представляющая пользователя, нажимающего кнопку
Наблюдаемая, представляющая устройство, возвращающее следующее значение
После того, как пользователь нажметКнопка должна подождать, пока устройство вернет свое следующее значение, затем это значение должно быть захвачено и обработано.После этого он должен снова ждать той же последовательности событий.
Я обнаружил, что это работает один раз, если я использую concat, и я завершаю наблюдаемые после получения действия кнопки и значения устройства.
Однако, после того, как наблюдаемые завершены, я больше не могу использовать их для последующих действий.
Я также обнаружил, что могу использовать zip
, который сработает после того, как обе наблюдаемые вернут их next (), но затемордер не гарантирован (он не вернет следующее значение после нажатия кнопки, он выдаст значение, которое было получено за это время).
Что было бы лучшим решением для этогодело?
import { Observable, Subject, forkJoin } from 'rxjs';
import { concat, repeat, switchMap } from 'rxjs/operators';
let user: Subject<any> = new Subject<any>();
let device: Subject<number> = new Subject<number>();
user.pipe(concat(device)).subscribe(() => {
console.log("both called");
});
setInterval(() => {
setTimeout(() => {
user.complete();
console.log("user action executed");
}, 2000);
setTimeout(() => {
device.next(new Date().getSeconds());
console.log("device value sent");
device.complete();
}, 5000);
}, 10000);