zip
est une solution rapide et sale qui a un défaut potentiellement grave: le gestionnaire de défilement est en retard sur la valeur réelle de défilement lorsque des événements de défilement émettent plus vite que la vitesse de défilement. Il ressemblerait à quelque chose comme:
Observable.fromEvent(window, 'scroll')
.map(event => event.currentTarget)
.zip(Observable.of(0, animationFrame)
.repeat(),
(currentTarget, _) => this._renderScrollBar(currentTarget)
);
Si vous avez besoin event
pour contenir les dernières informations de défilement, vous pourriez avoir besoin de recourir à une solution plus élaborée avec the window
operator, comme:
Observable.fromEvent(window, 'scroll')
.map(event => event.currentTarget)
.window(Observable.of(0, animationFrame).repeat())
.mergeMap(w => w.takeLast(1))
.subscribe(currentTarget => this._renderScrollBar(currentTarget));
- Foremost ,
window
crée un flux de morceaux Observable à partir de la source, fragmenté chaque fois que l'argument Observable émet un élément. Dans ce cas, des séries d'événements de défilement sont tronquées par chaque tique d'animation.
- Nous prenons seulement les plus récents de chaque morceau si le morceau n'est pas vide, et
mergeMap
cela à un flux de sortie plat. Les morceaux vides ne contribueront aucun élément à ce dernier flux.
Je ne pense pas qu'il y ait un moyen facile d'exécuter une action sur tous les animationFrame en RxJS. – martin
Is [zip] (http://reactivex.io/documentation/operators/zip.html) le comportement que vous recherchez? – concat
@concat Je pense que vous seriez en mesure de faire un échantillon dans la réponse? Je vais l'essayer et le marquer correctement –