Лично я бы предпочел rxjs
, а именно: BehaviorSubject, ReplaySubject и AsyncSubject, а не EventEmitter
, чтобы обмениваться данными между компонентами в Angular. Для больших проектов Redux , конечно, еще один вариант. Глядя на вашу ситуацию, было бы неплохо использовать ReplaySubject
, поскольку он может отправлять «старые» значения новым подписчикам.
ReplaySubject:
ReplaySubject сопоставим с поведением субъекта в том, что он может отправлять «старые» значения новым подписчикам. Однако у него есть дополнительная характеристика c, позволяющая записывать часть наблюдаемого выполнения и, следовательно, сохранять несколько старых значений и «воспроизводить» их новым подписчикам.
При создании объекта ReplaySubject вы можете указать, сколько значений Вы хотите хранить и как долго вы хотите хранить их. Другими словами, вы можете указать: «Я хочу сохранить последние 5 значений, которые были выполнены за последнюю секунду до новой подписки». Смотрите пример кода ниже:
replaySubject. js:
import * as Rx from "rxjs";
const subject = new Rx.ReplaySubject(2);
// subscriber 1
subject.subscribe((data) => {
console.log('Subscriber A:', data);
});
subject.next(Math.random())
subject.next(Math.random())
subject.next(Math.random())
// subscriber 2
subject.subscribe((data) => {
console.log('Subscriber B:', data);
});
subject.next(Math.random());
// Subscriber A: 0.3541746356538569
// Subscriber A: 0.12137498878080955
// Subscriber A: 0.531935186034298
// Subscriber B: 0.12137498878080955
// Subscriber B: 0.531935186034298
// Subscriber A: 0.6664809293975393
// Subscriber B: 0.6664809293975393
Как упоминалось ранее, вы также можете указать, как долго вы хотите сохранять значения в теме воспроизведения.
replaySubject-2. js:
import * as Rx from "rxjs";
const subject = new Rx.ReplaySubject(2, 100);
// subscriber 1
subject.subscribe((data) => {
console.log('Subscriber A:', data);
});
setInterval(() => subject.next(Math.random()), 200);
// subscriber 2
setTimeout(() => {
subject.subscribe((data) => {
console.log('Subscriber B:', data);
});
}, 1000)
// Subscriber A: 0.44524184251927656
// Subscriber A: 0.5802631630066313
// Subscriber A: 0.9792165506699135
// Subscriber A: 0.3239616040117268
// Subscriber A: 0.6845077617520203
// Subscriber B: 0.6845077617520203
// Subscriber A: 0.41269171141525707
// Subscriber B: 0.41269171141525707
// Subscriber A: 0.8211466186035139
// Subscriber B: 0.8211466186035139
Для получения более подробной информации смотрите Понимание rx js BehaviorSubject, ReplaySubject и AsyncSubject . Надеюсь, это поможет ...