Foto vum Chris Liverani am Unsplash

Debounce vs Throttle vs Queue Ausféierung

Mir hunn vill Artikelen um Internet erkläert wat Debouncing, Throttling sinn a wat den Ënnerscheed tëscht hinnen ass. Awer déi meescht, déi ech fonnt hunn, waren dacks laang, duerchernee a mat komplizéierte Code Beispiller (wa méiglech).

Also hunn ech vereinfacht Aarbechtscode Beispiller gemaach fir si fir d'Konzept an engem Jiffy ze kréien. Loosst ufänken mat der méi einfacher, Debounce.

Ofkennen

Eng Funktioun ofbriechen ass praktesch wann se kontinuéierlech opgeruff ginn a mir wëllen datt se no enger gewëssener Zäit ausféiert wann d'Zäit zënter dem leschte Uruff passéiert ass.

Dëst ass praktesch an Fäll wou mir d'Situatioun wëllen stabiliséieren ier Dir den Händler rufft fir d'Performance ze verbesseren. Ee vun de beschten Beispiller vu Debounce déi ech fonnt hunn, war an dësem Blog vum Jhey Tompkins

Fir ze debounen, kéinte mir e puer Autosparen Feature an eiser Applikatioun hunn. Mat Auto spueren op der Applikatioun probéiert den Zoustand vun eiser Applikatioun ze späicheren all Kéier wann de Benotzer en Update mécht oder eng Interaktioun huet. Et waart 5 Sekonne fir sécher ze stellen, datt keng aner Updates oder Interaktioune gemaach gi ier de Staat gespäichert gëtt soss en den neie Staat registréiert an de Prozess widderhëlt. Wann iergendeng Interaktioun geschitt ass, reset säin Timer fir 5 Sekonnen erëm.

Funktioun entloossen (func, waitTime) {
    var Timeout;

    zréck Funktioun () {
        clearTimeout (Zäitzäit);
        timeout = setTimeout (func, waitTime);
    };
};

Dat ass et, dat ass wéi einfach Ofkenntnesser sinn.

Drossel

Dës Technik ass méi apt genannt. Eng Throttling vun enger Funktioun ass praktesch wann se kontinuéierlech opgeruff gëtt a mir wëllen datt se all x Sekonn ausféiert. E gutt Beispill vun dësem wier e Scrollhandler oder e Resize Handler, wou mir den Handler eemol an enger fixer Zäit ausféieren, och wann d'Funktioun kontinuéierlech opgeruff gëtt.

Funktiounsdrottel (func, waitTime) {
    var timeout = null;
    var virdrun = 0;

    var méi spéit = Funktioun () {
        virdrun = Date.now ();
        timeout = null;
        func ();
    };

    zréck Funktioun () {
        var elo = Date.now ();
        var bleift = Waitzäit - (elo - virdru);
        wann (bleiwen <= 0 || bleiwen> Waachzäit) {
            wann (Zäitoutfall) {
                clearTimeout (Zäitzäit);
            }
            spéider ();
        } soss wann (! timeout) {// null timeout -> keng pendent Ausféierung
            
            timeout = setTimeout (méi spéit, bleift);
        }
    };
};

Extra: Queue

Op de Linnen vun der Ofdreiwung an der Iwwerschoss kënnen d'Funktiounsaufungen och an der Schlaang waarden. An dëser Funktioun gëtt d'Zuel vun de Mol ausgeruff wéi et genannt gëtt, awer et gëtt eng fix Waardezäit virun all Ausféierung. Et koum zënter kuerzem praktesch fir mech wann ech eng Bibliothéik benotzt hunn an e Feeler koum a verschidde Funktiounen an him ruffen ouni Verzögerung war en Thema. (et kann een och aner Benotzungsfäll hunn :))

Funktiounsstrooss (func, waitTime) {
    var funcQueue = [];
    var isWaiting;

    var executeFunc = Funktioun (Params) {
        isWaiting = richteg;
        func (Params);
        setTimeout (spillen, WaitTime);
    };

    var spillen = Funktioun () {
        isWaiting = falsch;
        wann (funcQueue.length) {
            var params = funcQueue.shift ();
            exekutéierenFunc (Params);
        }
    };

    zréck Funktioun (Params) {
        wann (isWaiting) {
            funcQueue.push (Params);
        } soss {
            exekutéierenFunc (Params);
        }
    }
};

Zum Ofschloss

Ier Dir eng Optimiséierungstechnik entscheet, huelt e Schrëtt zréck a denkt wéi eng déi bescht Resultat fir deem Fall gëtt. Et gëtt ëmmer een deen méi performant ass.

Gitt Iech gratis eng Äntwert ze verloossen oder tweet mech mat all Froen oder Suggestiounen.