Ljósmynd af Chris Liverani á Unsplash

Frestaðu vs keyrslu vs biðröð framkvæmd

Við erum með fullt af greinum á internetinu sem útskýra hvað Framsóknir, þrengingar eru og hver munurinn er á milli þeirra. En flestum sem ég fann voru oft löng, ruglingsleg og með flókin dæmi um kóða (ef einhver eru).

Svo ég hef komið upp með einfölduð vinnukóðadæmi fyrir þau til að fá hugmyndina í djóki. Við skulum byrja á því auðveldara, Debounce.

Frestaðu

Að segja frá aðgerð kemur sér vel þegar hringt er stöðugt í hana og við viljum að hún fari fram eftir ákveðinn tíma ef tími er liðinn frá síðasta símtali.

Þetta kemur sér vel í tilvikum þar sem við viljum að ástandið stöðugist áður en hringt er í stjórnandann til að bæta árangur. Eitt besta dæmið um fráfall sem ég fann var í þessu bloggi af Jhey Tompkins

Við getum sagt að þú hafir einhvern sjálfvirkan vistunareiginleika í forritinu. Með sjálfvirkri vistun á forritinu reynir að vista ástand umsóknar okkar í hvert skipti sem notandinn gerir uppfærslu eða hefur einhver samskipti. Það bíður í 5 sekúndur til að ganga úr skugga um að engar aðrar uppfærslur eða samspil séu gerðar áður en ástandið er vistað, það skráir nýja ríkið og endurtekur ferlið. Ef einhver samskipti eiga sér stað þá endurstillir tímastillirinn í 5 sekúndur aftur.

aðgerðartilkynning (func, waitTime) {
    var tími;

    skilaaðgerð () {
        clearTimeout (tími);
        tími = setTimeout (func, waitTime);
    };
};

Það er það, það er einfalt upphaf sem getur verið.

Inngjöf

Þessi aðferð er viðeigandi nefnd. Að stilla aðgerð kemur sér vel þegar hringt er stöðugt á hana og við viljum að hún fari fram á x sekúndna fresti. Gott dæmi um þetta væri skrunaðgerðarmaður eða stærð stýrimanns, þar sem við viljum framkvæma stjórnandann einu sinni á föstu tímabili, jafnvel þó aðgerðin verði stöðug hringd.

virka inngjöf (func, waitTime) {
    var tími = null;
    var fyrri = 0;

    var seinna = fall () {
        fyrri = Date.now ();
        tími = null;
        func ();
    };

    skilaaðgerð () {
        var núna = Date.now ();
        var eftir = biðtími - (nú - fyrri);
        ef (eftir <= 0 || eftir> biðtími) {
            ef (tími) {
                clearTimeout (tími);
            }
            seinna ();
        } annað ef (! tími tími) {// null tími -> engin framkvæmd í bið
            
            tími = setTimeout (seinna, eftir);
        }
    };
};

Aukalega: Biðröð

Á línunum með frávísun og inngjöf er einnig hægt að setja biðtöl í aðgerðum. Í þessu er aðgerðin keyrð fjölda skipta sem hún er kölluð en það er fastur biðtími fyrir hverja framkvæmd. Það kom mér vel nýlega fyrir mig þegar ég var að nota bókasafn og lenti í villu sem kallaði á aðgerð í það margoft án tafar var að valda vandræðum. (það geta verið önnur notatilfelli líka :))

virka biðröð (func, waitTime) {
    var funcQueue = [];
    var er að bíða;

    var executeFunc = fall (params) {
        isWaiting = satt;
        func (params);
        setTimeout (spila, bíða tíma);
    };

    var play = fall () {
        isWaiting = ósatt;
        ef (funcQueue.length) {
            var params = funcQueue.shift ();
            framkvæmaFunc (params);
        }
    };

    skilaaðgerð (params) {
        ef (er að bíða) {
            funcQueue.push (params);
        } Annar {
            framkvæmaFunc (params);
        }
    }
};

Að álykta

Áður en þú ákveður hagræðingaraðferð skaltu taka skref til baka og hugsa um hver muni skila bestum árangri fyrir það mál. Það er alltaf einn sem verður afkastamikill.

Vinsamlegast ekki hika við að skilja eftir svar eða kvak mig með spurningum eða ábendingum.