Разберитесь в сценариях дросселирования, защиты от встряхивания и использования JS за 7 минут.

внешний интерфейс JavaScript Google Ajax

предисловие

Говорят, что у Али есть вопрос для интервью.регулирование функцииа такжеФункция защиты от тряски. Ой, это задевает мои слепые пятна знаний. Кажется, я никогда не слышал об этих двух вещах. вот так!

15341407332107

Понятия и примеры

Функция debounce (дебаунс)

Обратный вызов выполняется через n секунд после запуска события, и если он снова запускается в течение этих n секунд, таймер переустанавливается.

Посмотрите на 🌰 (каштан):

//模拟一段ajax请求
function ajax(content) {
  console.log('ajax request ' + content)
}

let inputa = document.getElementById('unDebounce')

inputa.addEventListener('keyup', function (e) {
    ajax(e.target.value)
})

Взгляните на беговые результаты:

2018-09-04 09 23 46

Видно, что мы будем запускать этот запрос AJAX, пока нажимаем на клавиатуру. Мало того, что это пустая трата ресурсов, но и в практических приложениях пользователи также запрашиваются после вывода полного символа. Ниже оптимизируем:

//模拟一段ajax请求
function ajax(content) {
  console.log('ajax request ' + content)
}

function debounce(fun, delay) {
    return function (args) {
        let that = this
        let _args = args
        clearTimeout(fun.id)
        fun.id = setTimeout(function () {
            fun.call(that, _args)
        }, delay)
    }
}
    
let inputb = document.getElementById('debounce')

let debounceAjax = debounce(ajax, 500)

inputb.addEventListener('keyup', function (e) {
        debounceAjax(e.target.value)
    })

Взгляните на беговые результаты:

2018-09-04 09 29 50

Видно, что после того, как мы добавили антишейк, при частом вводе запрос не будет отправляться, а функция будет выполняться только тогда, когда у вас нет ввода в течение заданного интервала. Если вы перестанете печатать, а затем снова введете в течение указанного интервала времени, время будет запущено заново. Еще один взгляд 🌰:

    
let biu = function () {
    console.log('biu biu biu',new Date().Format('HH:mm:ss'))
}

let boom = function () {
    console.log('boom boom boom',new Date().Format('HH:mm:ss'))
}


setInterval(debounce(biu,500),1000)
setInterval(debounce(boom,2000),1000)

Взгляните на беговые результаты:

2018-09-04 09 32 21

Это 🌰 является хорошим объяснением, если функция выполняется в течение интервала, время будет запущено повторно. biu будет выполняться каждую 1 секунду после выполнения первых 1,5 секунд, а стрела не будет выполняться ни разу. Поскольку его временной интервал равен 2 с, а время выполнения — 1 с, отсчет времени перезапускается каждый раз.

Личное понимание Функция антивстряски заключается в том, чтобы прочитать статью, когда маг посылает навык.Если навык не закончен, нажмите навык, чтобы прочитать статью снова.

функция дроссельной заслонки

В течение указанной единицы времени она может быть запущена только один раз. Если этот блок в течение времени запускает несколько функций, они вступают в силу только один раз.

Проверьте один 🌰:


  function throttle(fun, delay) {
        let last, deferTimer
        return function (args) {
            let that = this
            let _args = arguments
            let now = +new Date()
            if (last && now < last + delay) {
                clearTimeout(deferTimer)
                deferTimer = setTimeout(function () {
                    last = now
                    fun.apply(that, _args)
                }, delay)
            }else {
                last = now
                fun.apply(that,_args)
            }
        }
    }

    let throttleAjax = throttle(ajax, 1000)

    let inputc = document.getElementById('throttle')
    inputc.addEventListener('keyup', function(e) {
        throttleAjax(e.target.value)
    })

Взгляните на беговые результаты:

2018-09-04 09 36 49

Видно, что когда мы продолжаем вводить, ajax будет выполняться каждую 1 секунду в соответствии с установленным нами временем.

В сочетании только с biubiubiu 🌰:


    let biubiu = function () {
        console.log('biu biu biu', new Date().Format('HH:mm:ss'))
    }

    setInterval(throttle(biubiu,1000),10)

2018-09-04 09 37 58

Какой бы маленький интервал времени выполнения мы ни установили, он всегда выполняется только один раз в течение 1 с.

Лично понимаю, что функция дросселирования - это скорость стрельбы в играх fps.Даже если вы продолжаете нажимать кнопку мыши, чтобы стрелять, она будет стрелять только пулями в пределах указанной скорости стрельбы.

Суммировать

  • Функция защиты от сотрясений и функция дросселирования предотвращают частые срабатывания в определенное время, но принципы у этих двух братьев разные.
  • Функция anti-shake выполняется только один раз в определенный период времени, а функция throttling выполняется через определенные промежутки времени.

Комбинируйте сценарии приложений

  • debounce
    • Поиск Поиск Lenovo, когда пользователи постоянно вводят значения, использует защиту от сотрясений для экономии ресурсов запросов.
    • Когда окно вызывает изменение размера, постоянное изменение размера окна браузера будет постоянно запускать это событие, а использование защиты от сотрясений заставит его запускаться только один раз.
  • throttle
    • Мышь непрерывно нажимается для срабатывания, mousedown (срабатывает только один раз в единицу времени)
    • Слушайте события прокрутки, например, нужно ли скользить вниз, чтобы автоматически загрузить больше, использовать дроссель, чтобы судить

расширять

Ссылка на ссылку:блог woo woo woo.cn на.com/self-sustaining/afraid/533…

15343043539670

Вот классический код на высоте:


    function throttle(method, context) {
        clearTimeout(method.tId);
        method.tId = setTimeout(function () {
            method.call(context);
        }, 100)
    }

Из приведенного выше примера мы знаем, что эта функция должна быть функцией антидребезга, а не функцией дросселирования. Во многих статьях также будет использоваться этот код в качестве примера. Сама функция правильная, но имя неправильное.

Оригинальное авторское предложение хорошо написано.

Возьмем, к примеру, дроссель: однажды учитель дал вам задание, чтобы вы могли глубже понять дроссель, и давайте поговорим об этом в классе на следующий день. Чжан Сан был очень счастлив. Он видел эту концепцию в классической книге "Продвинутое программирование на JavaScript". Когда он открыл ее, там было всего две страницы, и объяснение было очень ясным. Прочитав ее, он был счастлив заняться другими вещами. . Что касается Ли Си, он чувствовал, что Elevation III мало что говорит, поэтому он отправился в Google за другими сведениями о дросселе и был взволнован, увидев несколько способов написания функции дросселя. на этот раз он обнаружил, что одновременно с дроссельной заслонкой появляется дребезг, что это, черт возьми, такое? Во всяком случае, учитель не сказал, я увижу это позже, поэтому я пошел играть в игру довольный. А Ван Ву, как и Ли Си, открыл debounce, что это? Давайте разберемся вместе, а затем обнаружим, что использование debounce на самом деле такое же, как дроссель в Elevation 3! Продолжайте копать и обнаружите, что функция дроссельной заслонки в Elevation 3 на самом деле должна называться устранением дребезга.В конце концов, Ван Ву полностью разобрался в дроссельной заслонке и подавлении дребезга.

Мы должны быть королями пятерки, и мы будем бороться за досрочный выход! Ну давай же!

Широкая реклама

Эта статья была опубликована вЕженедельный выпуск Mint Front End, Добро пожаловать в Watch & Star ★, пожалуйста, указывайте источник при перепечатке.

Добро пожаловать, чтобы обсудить, поставить лайк и перейти 。◕‿◕。~