Подождите x секунд для нового испускаемого значения перед запуском функции

У меня есть дочерний компонент, который выдает значение, а в родительском я выполняю вызов axios с этим значением каждый раз, когда оно выдается. Моя проблема в том, что я хочу инициировать вызов axios только в том случае, если за x мс (или секунд) ребенок не выдал другое значение, чтобы уменьшить количество вызовов, которые я делаю.

Код здесь:

<script>
import axios from "axios";

import DataTable from './DataTable.vue';

export default {
    name: 'Test',
    data() {
        return {
            gamertags: [],

            // Utils
            timeout: 500,
            delay: 500
        }
    },
    methods: {
        // API calls
        async getGamerTags(string='') {
            const path = `http://localhost:5000/gamertags?string=${string}`
            await axios.get(path)
                .then((res) => {
                    this.gamertags = res.data;
                })
                .catch((error) => {
                    console.error(error);
                });
        },

        // DataTable
        handleFilters(filters) {
            clearTimeout(this.timeout);
            this.timeout = setTimeout(this.getGamerTags(filters.find(o => o.field == "playerGamerTag").filter), this.delay);
        }
    }
    components: {
        DataTable
    }
};
</script>

<template>
    <DataTable
        @filters = "handleFilters"
    />
</template>

Заранее спасибо.

Отказ от дребезга — это то, что вы ищете lodash.com/docs/4.17.15#debounce.

radovix 12.05.2022 10:32
setTimeout ожидает функцию в качестве первого аргумента. Вы не передаете функцию, вы вызываете свою функцию и передаете ее результат в setTimeout
Michal Levý 12.05.2022 11:07
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
41
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Было бы лучше понять проблему и вариант использования, если вы также добавите код. но как я понял проблема в двух направлениях

  1. если вы используете внутренний ввод и запускаете событие @changed, вы можете добавить @change.lazy это не запускать при каждом изменении.
  2. второе решение - использовать setTimeout(function,delayInMs) внутри родителя

ссылка на документацию vuejs

@change.lazy это не то, что я хочу, я хочу что-то вроде этого поста: stackoverflow.com/questions/1909441/… И я добавил код в пост
hitaton 12.05.2022 10:57
Ответ принят как подходящий

Что вам нужно, так это разоблачение. Вот пример:

var timeout, delay = 3000;

function func1() {
  clearTimeout(timeout);
  timeout = setTimeout(function(){
    alert("3000 ms inactivity");
  }, delay);
}
<input type = "text" oninput = "func1()">

При излучении просто вызовите func1(), и если новых излучений не будет через 3000 мс, функция по таймауту будет выполнена.

Я добавил свой код, и ваше решение, похоже, не работает. Как будто функция срабатывает каждый раз, когда выдается значение, и через 500 мс у меня появляется эта ошибка Uncaught SyntaxError: Unexpected identifier

hitaton 12.05.2022 10:56

@hitaton, я добавил фрагмент в свой ответ, и он работает нормально.

Henryc17 12.05.2022 11:09

@hitaton, кроме того, синтаксическая ошибка может быть вызвана отсутствующей или ненужной запятой, точкой с запятой или другими идентификаторами в исходном коде.

Henryc17 12.05.2022 11:11

Итак, я решил, что должен изменить свой код на this.timeout = setTimeout(function() {this.getGamerTags(filters.find(o => o.field == "playerGamerTag").filter);}, this.delay);, но с этим у меня ошибка TypeError: this.getGamerTags is not a function

hitaton 12.05.2022 11:30

Хорошо, плохо, я просто не знал, как использовать функцию setTimeout с параметрами. Я написал ответ на свой пост. Спасибо большое.

hitaton 12.05.2022 11:34

Просто изменив функцию handleFilters на:

handleFilters(filters) {
   clearTimeout(this.timeout);
   this.timeout = setTimeout(
      this.getGamerTags,
      this.delay,
      filters.find(o => o.field == "playerGamerTag").filter
   );
},

проблема решена.

Другие вопросы по теме