Android&RN&Flutter實戰(zhàn)——防抖節(jié)流函數(shù)

1.背景介紹

防抖

函數(shù)防抖恕洲,這里的抖動就是執(zhí)行的意思霜第,而一般的抖動都是持續(xù)的泌类,多次的底燎。假設(shè)函數(shù)持續(xù)多次執(zhí)行,我們希望讓它冷靜下來再執(zhí)行双仍。也就是當(dāng)持續(xù)觸發(fā)事件的時候朱沃,函數(shù)是完全不執(zhí)行的搬卒,等最后一次觸發(fā)結(jié)束的一段時間之后翎卓,再去執(zhí)行失暴。

節(jié)流

節(jié)流的意思是讓函數(shù)有節(jié)制地執(zhí)行,而不是毫無節(jié)制的觸發(fā)一次就執(zhí)行一次古戴。什么叫有節(jié)制呢缴阎?就是在一段時間內(nèi),只執(zhí)行一次述暂。


2.經(jīng)典舉例

  1. 防抖函數(shù):搜索頁面,用戶連續(xù)輸入,等停下來再去觸發(fā)搜索接口
  2. 節(jié)流函數(shù):防止按鈕連點


3.Android實現(xiàn)

  1. 代碼實現(xiàn):
object FunctionUtil {
    private const val DEFAULT_DURATION_TIME = 300L
    var timer: Timer? = null


    /**
     * 防抖函數(shù)
     */
    fun debounce(duration: Long = DEFAULT_DURATION_TIME, doThing: () -> Unit) {
        timer?.cancel()
        timer = Timer().apply {
            schedule(timerTask {
                doThing.invoke()
                timer = null
            }, duration)
        }
    }

    /**
     * 節(jié)流函數(shù)
     */
    var lastTimeMill = 0L
    fun throttle(duration: Long = DEFAULT_DURATION_TIME, continueCall: (() -> Unit)? = null, doThing: () -> Unit) {
        val currentTime = System.currentTimeMillis()
        if (currentTime - lastTimeMill > duration) {
            doThing.invoke()
            lastTimeMill = System.currentTimeMillis()
        } else {
            continueCall?.invoke()
        }
    }
}
  1. 使用:
btn_sure.setOnClickListener {
    FunctionUtil.throttle {
        Log.i("nell-click", "hahah")
    }
}

btn_sure.setOnClickListener {
    FunctionUtil.throttle(500L) {
        Log.i("nell-click", "hahah")
    }
}

FunctionUtil.debounce {
    searchApi(text)
}

4.RN實現(xiàn)

  1. 代碼實現(xiàn):
/**
 * 防抖函數(shù)
 */
function debounce(func, delay) {
  let timeout
  return function() {
    clearTimeout(timeout)
    timeout = setTimeout(() => {
      func.apply(this, arguments)
    }, delay)
  }
}

/**
 * 節(jié)流函數(shù)
 */
function throttle(func, delay) {
    let run = true
    return function () {
      if (!run) {
        return
      }
      run = false // 持續(xù)觸發(fā)的話,run一直是false艺配,就會停在上邊的判斷那里
      setTimeout(() => {
        func.apply(this, arguments)
        run = true // 定時器到時間之后,會把開關(guān)打開转唉,我們的函數(shù)就會被執(zhí)行
      }, delay)
    }
}

  1. 使用:
throttle(function (e) {
  console.log("nell-click")
}, 1000)


debounce(function (e) {
    searchApi(text)
}, 300)

5.Flutter實現(xiàn)

  1. 代碼實現(xiàn):
class CommonUtil {
  static const deFaultDurationTime = 300;
  static Timer timer;

  // 防抖函數(shù)
  static debounce(Function doSomething, {durationTime = deFaultDurationTime}) {
    timer?.cancel();
    timer = new Timer(Duration(milliseconds: durationTime), () {
      doSomething?.call();
      timer = null;
    });
  }

  // 節(jié)流函數(shù)
  static const String deFaultThrottleId = 'DeFaultThrottleId';
  static Map<String, int> startTimeMap = {deFaultThrottleId: 0};
  static throttle(Function doSomething, {String throttleId = deFaultThrottleId, durationTime = deFaultDurationTime, Function continueClick}) {
    int currentTime = DateTime.now().millisecondsSinceEpoch;
    if (currentTime - (startTimeMap[throttleId] ?? 0) > durationTime) {
      doSomething?.call();
      startTimeMap[throttleId] = DateTime.now().millisecondsSinceEpoch;
    } else {
      continueClick?.call();
    }
  }
  
}
  1. 使用:
GestureDetector(
      onTap: () => CommonUtil.throttle(onTap, durationTime: durationTime)
)


CommonUtil.debounce(searchApi)

完結(jié)赠法,撒花??

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市款侵,隨后出現(xiàn)的幾起案子新锈,更是在濱河造成了極大的恐慌,老刑警劉巖妹笆,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件聋涨,死亡現(xiàn)場離奇詭異牍白,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)茂腥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門最岗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來般渡,“玉大人,你說我怎么就攤上這事脸秽『牵” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵片酝,是天一觀的道長雕沿。 經(jīng)常有香客問我猴仑,道長宁脊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任稳衬,我火速辦了婚禮薄疚,結(jié)果婚禮上赊琳,老公的妹妹穿的比我還像新娘躏筏。我一直安慰自己,他們只是感情好趁尼,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布酥泞。 她就那樣靜靜地躺著,像睡著了一般似炎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上叹阔,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天传睹,我揣著相機(jī)與錄音,去河邊找鬼睛藻。 笑死邢隧,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的倒慧。 我是一名探鬼主播纫谅,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼兰珍!你這毒婦竟也來了询吴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤猛计,失蹤者是張志新(化名)和其女友劉穎唠摹,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奉瘤,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡勾拉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了毛好。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片望艺。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡苛秕,死狀恐怖肌访,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情艇劫,我是刑警寧澤吼驶,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響蟹演,放射性物質(zhì)發(fā)生泄漏酒请。R本人自食惡果不足惜布朦,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一澄惊、第九天 我趴在偏房一處隱蔽的房頂上張望掸驱。 院中可真熱鬧滚婉,春花似錦让腹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽佃牛。三九已至俘侠,卻和暖如春央星,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背禁谦。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工遥皂, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人样悟。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓蔼水,卻偏偏與公主長得像趴腋,于是被迫代替她去往敵國和親颁井。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

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