Sobes.tech
Middle

რეზიუმეში აღნიშნულია Race პირობებისგან დაცვის უზრუნველყოფა באמצעות AbortController. როგორ ინტეგრირებთ ზუსტად მოთხოვნების გაუქმებას Vue კომპონენტის სიცოცხლის ციკლში? მაგალითად, თუ მომხმარებელი გვერდს დატოვებს მოთხოვნის დასრულებამდე, როგორ რეალიზებთ ამას რთული Pinia ლოგიკით?

sobes.tech AI

პასუხი AI-სგან

Для предотвращения race condition и утечек памяти при отмене запросов в Vue с использованием Pinia и AbortController можно сделать так:

  1. В компоненте создайте экземпляр AbortController при монтировании.
  2. Перед отправкой запроса передайте signal из этого контроллера в fetch/Axios.
  3. В хуке beforeUnmount вызывайте abort() для отмены всех незавершённых запросов.
  4. Если логика сложная и запросы инициируются из Pinia, можно хранить AbortController в состоянии стора или передавать его в экшены.

Пример:

import { defineComponent, onBeforeUnmount } from 'vue'
import { useStore } from '@/stores/myStore'

export default defineComponent({
  setup() {
    const store = useStore()
    const controller = new AbortController()

    store.fetchData({ signal: controller.signal })

    onBeforeUnmount(() => {
      controller.abort() // отменяем запрос при уходе со страницы
    })
  }
})

В Pinia:

import { defineStore } from 'pinia'
import axios from 'axios'

export const useStore = defineStore('main', {
  actions: {
    async fetchData({ signal }) {
      try {
        const response = await axios.get('/api/data', { signal })
        this.data = response.data
      } catch (e) {
        if (axios.isCancel(e)) {
          console.log('Запрос отменён')
        } else {
          throw e
        }
      }
    }
  }
})

Такой подход гарантирует, что при уходе пользователя со страницы все незавершённые запросы будут отменены, предотвращая race condition и ненужные обновления состояния.