2017-03-29 10 views
5

क्या आरएक्सजेएस में कोई ऑपरेटर है जो "विस्फोट में पहली घटना" में देरी के बिना बहस करता है, लेकिन "विस्फोट में आखिरी घटना" में देरी (और हमेशा उत्सर्जित) करता है?प्रारंभिक देरी के बिना बहस

कुछ इस तरह:

---a----b-c-d-----e-f---

awesome-debounce(2 dashes) के बाद हो जाता है:

---a----b------d--e----f

जबकि एक सामान्य debounce होगा:

-----a---------d-------f

यह थ्रॉटल और डिबॉन्स के बीच एक मिश्रण है ...

+0

तो क्या आप एक समय खिड़की में पहली और आखिरी घटना को उत्सर्जित करना चाहते हैं? – paulpdaniels

+0

हां, लेकिन समय खिड़की debounce के साथ व्यवहार करता है (यह खिड़की के अंदर प्रत्येक घटना के साथ बढ़ाया जाता है)। – Roman

+0

यह वास्तविक उत्तर है! https://stackoverflow.com/a/30145789/684869 – cgatian

उत्तर

1

हम्म, यह सबसे आसान समाधान है जिसे मैं सोच सकता हूं। आपके लिए दिलचस्प हिस्सा awesomeDebounce() फ़ंक्शन है जो उप-श्रृंखला बनाता है।

यह मूल रूप से सिर्फ throttle() और debounceTime() ऑपरेटरों को जोड़ती है:

const Rx = require('rxjs'); 
const chai = require('chai'); 

let scheduler = new Rx.TestScheduler((actual, expected) => { 
    chai.assert.deepEqual(actual, expected); 
    console.log(actual); 
}); 

function awesomeDebounce(source, timeWindow = 1000, scheduler = Rx.Scheduler.async) { 
    let shared = source.share(); 
    let notification = shared 
     .switchMap(val => Rx.Observable.of(val).delay(timeWindow, scheduler)) 
     .publish(); 

    notification.connect(); 

    return shared 
    .throttle(() => notification) 
    .merge(shared.debounceTime(timeWindow, scheduler)) 
    .distinctUntilChanged(); 
} 

let sourceMarbles = '---a----b-c-d-----e-f---'; 
let expectedMarbles = '---a----b------d--e----f'; 

// Create the test Observable 
let observable = scheduler 
    .createHotObservable(sourceMarbles) 
    .let(source => awesomeDebounce(source, 30, scheduler)); 

scheduler.expectObservable(observable).toBe(expectedMarbles); 
scheduler.flush(); 

भीतरी notification नमूदार तो मैं अपनी घड़ी मैन्युअल रूप से रीसेट कर सकते हैं जब मैं की जरूरत है throttle() ऑपरेटर के लिए ही प्रयोग किया जाता है। throttle() से आंतरिक सदस्यता पर स्वतंत्र होने के लिए मुझे इस पर्यवेक्षक को "गर्म" में भी बदलना पड़ा।

+0

मैं इस जवाब को अच्छे प्रदर्शन और संगमरमर परीक्षणों को शामिल करने के लिए एक उपहार देने वाला हूं। बस 24 घंटे इंतजार लंबित है –

-1

यह कई स्थितियों के लिए वास्तव में उपयोगी बहस प्रकार है। एक अगली रास्ते में merge, throttleTime और debounceTime का उपयोग करें:

Rx.Observable.merge(source.throttleTime(1000), source.debounceTime(2000)) 

पूर्ण उदाहरण यहाँ है http://jsbin.com/godocuqiwo/edit?js,console

नोट: यह न केवल पहले उत्सर्जित करेगा और debounce अंतराल में अंतिम मान लेकिन यह भी थ्रोटल द्वारा उत्पादित मूल्यों (है जो उदाहरण के लिए स्क्रॉल debouncing के लिए आमतौर पर अपेक्षित और आवश्यक)।

संबंधित मुद्दे