Насколько я понимаю, весь массив передается подписчику, в отличие от, скажем, наблюдателя интервала, который можно отписать / отменить.
Например, работает следующая отмена ...
// emit a value every second for approx 10 seconds
let obs = Rx.Observable.interval(1000)
.take(10)
let sub = obs.subscribe(console.log);
// but cancel after approx 4 seconds
setTimeout(() => {
console.log('cancelling');
sub.unsubscribe()
}, 4000);
<script src="https://unpkg.com/rxjs@5.5.10/bundles/Rx.min.js"></script>
Однако заменить интервал на массив нельзя.
// emit a range
let largeArray = [...Array(9999).keys()];
let obs = Rx.Observable.from(largeArray)
let sub = obs.subscribe(console.log);
// but cancel after approx 1ms
setTimeout(() => {
console.log('cancelling');
sub.unsubscribe()
}, 1);
// ... doesn't cancel
<script src="https://unpkg.com/rxjs@5.5.10/bundles/Rx.min.js"></script>
Необходимо ли каким-либо образом сделать каждый элемент асинхронным, например, поместив его в setTimeout (..., 0)?Возможно, я слишком долго смотрел на эту проблему и совершенно не в курсе, что обработку массива можно отменить?