如何理解debounce和throttle?

前端工程師們都聽(tīng)過(guò)看起來(lái)很高級(jí)的詞,節(jié)流和防抖玷过,其實(shí)節(jié)流就是throttle筑煮,防抖就是debounce真仲,其實(shí)這個(gè)也屬于前端性能優(yōu)化的一部分。

在做遠(yuǎn)程搜索時(shí)虑凛,如果每輸入1個(gè)字就調(diào)用1次接口,就會(huì)頻繁查詢數(shù)據(jù)庫(kù)延柠,假設(shè)我們的查詢是"一二三四五"锣披,不考慮用戶輸入錯(cuò)誤的情況,至少會(huì)請(qǐng)求5次榜跌。

  • 有沒(méi)有一種方法盅粪,可以隔個(gè)幾百毫秒再去查詢呢?
  • 有沒(méi)有更加高級(jí)的做法础浮,用戶輸入完成后奠骄,停頓了幾百毫秒再去查詢呢含鳞?

有沒(méi)有一種方法,可以隔個(gè)幾百毫秒再去查詢呢鸭廷?

有熔吗,可以為函數(shù)設(shè)置一個(gè)setTimeout函數(shù),相當(dāng)于定時(shí)調(diào)用接口讼载,這種方法是低效的中跌,也是非常愚蠢的,需要控制開(kāi)關(guān)定時(shí)器吱型,一旦搜索功能多了陨仅,就更蠢了。

有沒(méi)有更加高級(jí)的做法触徐,用戶輸入完成后撞鹉,停頓了幾百毫秒再去查詢呢?

有享郊,debounce就是做這個(gè)事情的孝鹊,lodash從0.1.0就支持了這個(gè)方法。

css-tricks的lodash debounce demo

<input type="text" class="autocomplete">
// 被debounce的函數(shù)苔咪,http請(qǐng)求柳骄,事件處理函數(shù)等等
function make_ajax_request(){
    // 這是一個(gè)調(diào)用后端api的方法
}
// 監(jiān)聽(tīng)事件并且調(diào)用lodash的debounce方法
$('.autocomplete').on('keydown',
     _.debounce(make_ajax_request, 1300));
});

demo地址:https://codepen.io/dcorb/embed/mVGVOL?height=257&theme-id=1&slug-hash=mVGVOL&default-tab=result&user=dcorb

vue項(xiàng)目中的lodash debounce demo

<template>
  <input @input="debounceHandleInput"/>
</template>

<script>
import _ from 'lodash';

export default {
  name: 'debounce',
  data() {
    return {
      starTime: 0,
      endTime: 0,
      delay: 1000,
    };
  },
  computed: {
    debounceHandleInput() {
      return _.debounce(this.handleInput, this.delay);
    },
  },
  methods: {
    handleInput(e) {
      console.log(`debounce wait時(shí)間為${this.delay}ms`);
      console.log('觸發(fā)了input事件', e.target.value);
      this.startTime = new Date().getTime();
      this.remoteMethod();
    },
    remoteMethod() {
      setTimeout(() => {
        const result = `后端請(qǐng)求已完成舔清!`;
        this.endTime = new Date().getTime();
        const costTime = this.endTime - this.startTime;
        console.log(result);
        console.log(`耗時(shí)${costTime}毫秒`);
      }, 2000);
    },
  },
};
</script>

打印結(jié)果:
debounce wait時(shí)間為1000ms
觸發(fā)了input事件 13131
后端請(qǐng)求已完成曲初!
耗時(shí)2000毫秒

在1000ms時(shí)間范圍內(nèi)觸發(fā),僅僅調(diào)用一次remoteMethod,也就是僅僅調(diào)用一次后端接口目锭,達(dá)到我們的預(yù)期效果纷捞。

debounce適用場(chǎng)景

  • Debouncing a input event handler (this example explain this use case)
  • Debouncing a resize event handler
  • Debouncing a save function in an autosave feature

在做滾動(dòng)加載時(shí),如果用戶滾動(dòng)的幅度過(guò)大奖唯,會(huì)導(dǎo)致加載的內(nèi)容過(guò)多丰捷,相當(dāng)于水的流量沒(méi)有控制,一瞬間大量的水量迸發(fā)而出病往,從而所看到的延后好幾個(gè)與預(yù)期的下一個(gè)不符的情況

  • 當(dāng)水流超過(guò)閥值時(shí)停巷,最多釋放出閥值量的水;水流小于閥值時(shí)蕾各,一切正常庆揪。有沒(méi)有一種辦法去控制水流的大腥铝颉?

有仔掸,throttle就是做這個(gè)事情的起暮,lodash從0.1.0也支持了這個(gè)方法。

具體demo就不寫了筒捺,因?yàn)?strong>throttle常用于連續(xù)事件的事件處理函數(shù)纸厉。

可以參考 https://css-tricks.com/the-difference-between-throttling-and-debouncing/ 文章最后的demo颗品,其中的throttle在scroll上的運(yùn)用,就是throttle的正確打開(kāi)方式则吟。

image

throttle適用場(chǎng)景

  • Throttling a scroll event in infinite scroll(demo case)
  • Throttling a mousemove/touchmove event handler in canvas

debounce和throttle的對(duì)比

地址:http://demo.nimius.net/debounce_throttle/
圖片:

image

通過(guò)在canvas上連續(xù)觸發(fā)mousemove事件我們發(fā)現(xiàn):

  • debounce只有當(dāng)連續(xù)事件停止后的一小段時(shí)間后再觸發(fā)一次氓仲,連續(xù)事件結(jié)束后可能只觸發(fā)一次
  • throttle會(huì)在連續(xù)事件的過(guò)程中敬扛,每隔一段時(shí)間至少觸發(fā)一次,連續(xù)事件結(jié)束后觸發(fā)不止一次

努力成為一個(gè)不掉隊(duì)的前端工程師舔哪!

期待和大家交流,共同進(jìn)步捉蚤,歡迎大家加入我創(chuàng)建的與前端開(kāi)發(fā)密切相關(guān)的技術(shù)討論小組:

努力成為優(yōu)秀前端工程師题暖!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末胧卤,一起剝皮案震驚了整個(gè)濱河市枝誊,隨后出現(xiàn)的幾起案子惜纸,更是在濱河造成了極大的恐慌,老刑警劉巖祠够,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件古瓤,死亡現(xiàn)場(chǎng)離奇詭異腺阳,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門痛侍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)主届,“玉大人,你說(shuō)我怎么就攤上這事枫夺』婷疲” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵扒最,是天一觀的道長(zhǎng)吧趣。 經(jīng)常有香客問(wèn)我耙厚,道長(zhǎng),這世上最難降的妖魔是什么俯渤? 我笑而不...
    開(kāi)封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任稠诲,我火速辦了婚禮诡曙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘劝萤。我一直安慰自己慎璧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著岁疼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瑰排。 梳的紋絲不亂的頭發(fā)上椭住,一...
    開(kāi)封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音宅广,去河邊找鬼傻挂。 笑死金拒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的资铡。 我是一名探鬼主播幢码,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼症副,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了闹啦?” 一聲冷哼從身側(cè)響起辕坝,我...
    開(kāi)封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤酱畅,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后窖逗,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體餐蔬,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了痴鳄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缸夹。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡虽惭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出芽唇,到底是詐尸還是另有隱情顾画,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布匆笤,位于F島的核電站研侣,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏炮捧。R本人自食惡果不足惜庶诡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望咆课。 院中可真熱鬧末誓,春花似錦、人聲如沸书蚪。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)撩幽。三九已至,卻和暖如春箩艺,著一層夾襖步出監(jiān)牢的瞬間窜醉,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工艺谆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留榨惰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓静汤,卻偏偏與公主長(zhǎng)得像琅催,于是被迫代替她去往敵國(guó)和親居凶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 前言 最近和前端的小伙伴們藤抡,在討論面試題的時(shí)候侠碧。談到了函數(shù)防抖和函數(shù)節(jié)流的應(yīng)用場(chǎng)景和原理。于是缠黍,想深入研究一下兩者...
    youthcity閱讀 23,517評(píng)論 5 78
  • 問(wèn)題的引出 在一些場(chǎng)景往往由于事件頻繁被觸發(fā)弄兜,因而頻繁地進(jìn)行DOM操作、資源加載瓷式,導(dǎo)致UI停頓甚至瀏覽器崩潰替饿。在這...
    Mica_馬超閱讀 2,237評(píng)論 0 2
  • 上一篇文章中介紹的屬性描述符的知識(shí)太偏于理論,今天閱讀的 throttle-debounce 模塊會(huì)實(shí)用許多贸典,在工...
    Maco_wang閱讀 11,429評(píng)論 1 5
  • 前言 props與state都是用于組件存儲(chǔ)數(shù)據(jù)的一js對(duì)象,前者是對(duì)外暴露數(shù)據(jù)接口,后者是對(duì)內(nèi)組件的狀態(tài),它們決...
    itclanCoder閱讀 2,144評(píng)論 0 0
  • 懷著愉快而放松的心情為今天的好種子澆水施肥曬太陽(yáng)[太陽(yáng)] [咖啡]咖啡冥想 ? 我近期最想實(shí)現(xiàn)的一個(gè)愿望或目標(biāo)是:...
    61593bf6d91c閱讀 168評(píng)論 0 1