2017-03-31 18 views
5

Bir kullanıcının bir sayfayı kaydırmasına izin veriyorum ve her kaydırma olayında -
görünüm noktasında yeni öğeler olup olmadığını kontrol ediyorum (varsa, bu yeni öğeler üzerinde bazı işlemler yapıyorum - şimdilik ilgisiz).RxJS - gazdan sonra debounce olayı?

const observable = Rx.Observable.fromEvent(window, 'scroll'); 

    const subscriber = observable.throttleTime(300 /* ms */).subscribe(
      (x) => { 
      console.log('Next: event!'); 
      }, 
      (err) => { 
      console.log('Error: %s', err); 
      }, 
     () => { 
      console.log('Completed'); 
      }); 

Bu kod beklendiği gibi çalıştığını ve her 300 ms sonra mesaj görüyorum:

Yani böyle bir şey var.

Ancak bir sorun var. Bir kullanıcı 300 ms'yi tamamlamadan (olayı yükseltilmezse) kaydırılabilir ve kaydırma sırasında yeni bir öğe görünür.

debounce yöntemine ihtiyacım olan yer burasıdır. (")" bir olay ortaya çıkar "anlamına gelen ()"

Tam olarak ihtiyacım olan şey budur.

I've tried this

:

const subscriber = observable.throttleTime(300 /* ms */).debounceTime(350).... 

Ama sadece debounced olayları bakın. Bir Sıçrama takmak -

Soru

nasıl gaz ve gaz sonunda kullanabiliriz?

+0

Bu çözümün [bu yanıt] 'a çok yakın bir şey olacağını düşünüyorum (http://stackoverflow.com/a/43104131/6680611). – cartant

+0

İki akışın birleştirilip birleştirilmediğini kontrol edin: sizin için daraltılmış ve geri döndürülen çalışmalar https://plnkr.co/edit/lHYVxSSrYA05wBWVqnqr?p=preview –

+0

@YuryTarabanko Gerçekten. teşekkür ederim. Lütfen bir cevap olarak gönderin (isterseniz) –

cevap

5

İki akışı birleştirebilirsiniz: sıkıştırılmış ve merge kullanarak bir tanesine dönüştürebilirsiniz. Demo.

const observable = Rx.Observable.fromEvent(window, 'scroll'); 

    const subscriber = observable 
     .throttleTime(300 /* ms */) 
     .map(() => 'throttle') 
     .merge(observable 
       .debounceTime(350) 
       .map(() => 'debounce') 
    ) 
     .subscribe(
      (x) => { 
      console.log('Next: event!', x); 
      }, 
      (err) => { 
      console.log('Error: %s', err); 
      }, 
     () => { 
      console.log('Completed'); 
      });