Как обрабатывать асинхронные операции в vue?

Вопрос: как обрабатывать асинхронные операции в Vue?

Линия поддержки
Линия поддержки Ответы на вопросы пользователей
14 ноября 2025

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

Изображение записи

Комментарий пользователя

Привет! Не уверена, когда выбирать computed, watch или watchEffect. Еще делаю fetch внутри watcher — как правильно отменять предыдущий запрос при быстром изменении зависимости?

Гранович Кристина Пользователь

Ответ специалиста

Здравствуйте! Коротко: computed для чистых производных значений, watch для побочных эффектов, когда вы хотите следить за конкретной reactive/ref переменной, watchEffect когда нужно отслеживать любое реактивное чтение внутри эффекта.

Для асинхронного кода в watch используйте onInvalidate (передается в callback) — через него удобно вызывать AbortController.abort() или пометить запрос как устаревший.

  • Максим Нивейкин

    Максим Нивейкин

    Младший фронтенд-разработчик Vue

Пример watch с отменой fetch через onInvalidate:


      import { ref, watch } from 'vue';

const q = ref('');
const results = ref([]);
const error = ref(null);

watch(q, (newQ, oldQ, onInvalidate) => {
  const ac = new AbortController();
  onInvalidate(() => ac.abort()); // отмена при следующем срабатывании

  (async () => {
    try {
      const res = await fetch(`/api/search?q=${encodeURIComponent(newQ)}`, { signal: ac.signal });
      if (!res.ok) throw new Error(res.statusText);
      results.value = await res.json();
    } catch (e) {
      if (e.name !== 'AbortError') error.value = e;
    }
  })();
});

Если нельзя отменять запросы, комбинируйте watch с локальным счетчиком (sequence token) и применяйте ответ только если токен совпадает с актуальным. watchEffect хорош, когда зависимости очевидны из тела эффекта и вам не хочется перечислять вузы вручную.

Присоединяйтесь к нашему сообществу и развивайтесь вместе с нами.