RxJS из массива - наблюдать за массивом и записывать в консоль при изменениях? - PullRequest
3 голосов
/ 01 мая 2019

Возможно ли .subscribe регулярно прослушивать массив и его элементы и новые console.log каждый раз, когда они помещаются в массив?

Вот код, с которым я экспериментировал

let arr = [1, 2, 3, 4, 5]
let arraySource = from(arr);
//output: 1,2,3,4,5

let subscribe = arraySource.subscribe(val => console.log(val));

setTimeout(() => {
  arr.push(6);
},2000);

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 02 мая 2019

Дело в том, что arr и arr$ не "связаны". Как только вы подписываетесь на arr$, исходные элементы в arr испускаются, а затем наблюдаемое завершается. Дальнейшие толчки к arr не пройдут через arr$:

const arr = [1,2,3];
const arr$ = from(arr);
arr$.subscribe(n => console.log(`n=${n}`));
arr.push(4);
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.1/rxjs.umd.min.js"></script>
<script>const {from} = rxjs;</script>

Возможно, вам следует взглянуть на Subject и отправить данные с помощью next().

Однако, если вас не волнует arr и вы просто хотите использовать push() в качестве средства для проталкивания данных через наблюдаемое, тогда есть хакерский способ. Лично я бы этого не делал, но покажу для демонстрации:

const arr = [];
const arr$ = fromEventPattern(handler => arr.push = handler);

arr$.subscribe(n => console.log(`n=${n}`));

let i = 0;
setInterval(() => arr.push(i++), 500);
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.1/rxjs.umd.min.js"></script>
<script>const {fromEventPattern} = rxjs;</script>
0 голосов
/ 02 мая 2019

Я думаю, вам нужно использовать observable.next() примерно так:

let arr = [1, 2, 3, 4, 5]
let arraySource = from(arr);
//output: 1,2,3,4,5

let subscribe = arraySource.subscribe(val => console.log(val));

setTimeout(() => {
  arraySource.next(6);
},2000);

И, возможно, есть еще один подписчик, который обновляет массив?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...