Leading=true, если debounce работает не так, как ожидалось

Используя debounce() lodash, я жду 10 секунд, прежде чем установить условие поиска в состоянии моего приложения. Но я хочу установить searching в состоянии моего приложения, прежде чем я отменю:

onChangeText(text) {
    setSearching(true);
    setSearchTerm(text);
}
render(){
    return(
        <TextInput style={s.input}
            onChangeText={_.debounce(this.onChangeText, 10000, {'leading':true} )}
        />
    )
}

Согласно документам, это должно выполняться по переднему краю времени ожидания, а не до события останавливаются на отведенное время ожидания. Фактическое поведение такое, как если бы вообще не было дребезга, события запускаются каждый раз, когда они вызываются без 10-секундного буфера. Любые идеи? Удаление {'leading':true} действительно делает устранение дребезга соответствующим образом, но мне нужно установить состояние в моем приложении до 10 секунд.


person smilebomb    schedule 25.09.2018    source источник
comment
У меня точно такая же проблема. Похоже на ошибку в lodash?   -  person Operator    schedule 20.07.2021
comment
@Operator Я не уверен, что я сделал, чтобы решить эту проблему. Я знаю, что 'leading' не в кавычках в моих текущих проектах, и это работает.   -  person smilebomb    schedule 20.07.2021


Ответы (2)


Вы можете указать ведущее значение true в своем пользовательском случае.

debounce(func, [wait=0], [options={ leading: true}])

Прочтите документ по ссылке https://lodash.com/docs#debounce.

person Anurag Chutani    schedule 25.09.2018
comment
onChangeText={ _.debounce(this.onChangeText, 1200, [options={leading:true,trailing:true}]) } такое же поведение, как и по умолчанию. - person smilebomb; 25.09.2018
comment
Похоже, правильный синтаксис - onChangeText={ _.debounce(this.onChangeText, 1200, {'leading':true,'trailing':false} ) }, но это дает мне поведение, похожее на полное отсутствие дребезга, а это не то, что мне нужно. - person smilebomb; 25.09.2018

Посмотрите, поможет ли этот подход:

debouncedSetSearchTerm = _.debounce(text => setSearchTerm(text), 10000)

onChangeText(text) {
    setSearching(true);
    debouncedSetSearchTerm(text);
}
render() {
    return(
        <TextInput style={s.input} onChangeText={onChangeText} />
    )
}

Вы должны сначала setSearching, а затем вызвать debouncedFn, который затем обработает searchTerm после задержки 10000.

person Akrion    schedule 26.09.2018
comment
Я проверил это локально, поэтому я уверен, что это работает. В любом случае, подход здесь важнее ... просто поиграйте с содержимым _.debounce(), но это способ установить ваше состояние, а затем устранить дребезг. - person Akrion; 26.09.2018
comment
Я пробую это решение, оно сначала устанавливает состояние, но выполняет вызов ajax для каждой буквы, набранной после задержки. - person Denny; 27.01.2020