watchEffect. Хочу прерывать предыдущий fetch запрос, идущий к api.
Дока:
watchEffect(async (onCleanup) => {
const { response, cancel } = doAsyncWork(id.value)
// `cancel` will be called if `id` changes
// so that previous pending request will be cancelled
// if not yet completed
onCleanup(cancel)
data.value = await response
})
Пример: у меня есть вот такой вотчер, который срабатывает каждый раз при изменении listedUsers. При срабатывании я отправляю запрос к апишке, чтобы получить общих друзей (getMutual). Если я буду быстро тогглить этот список, то с сервера будет прилетать ошибка (Too many requests).
Мой вотчер:
watch(
() => ({ ...listedUsers }),
async (newList, oldList, onInvalidate) => {
const ids = Object.keys(newList)
mutualFriends.value = await getMutual(ids)
}
)
Вопрос: как прерывать предыдущие запросы, чтобы избежать такого поведения? Нужно ли писать свою функцию cancel, как в примере? Как тогда ее возвращать, если getMutual асинхронная?
Смотря как работает getMutual. Решение будет скорее всего через AbortController и его использование в либе/модуле запросов у вас
Я понял, то есть, cancel — это не функция отмены "по умолчанию"? Ее нужно ручками написать, а потом возвращать из апи, правильно?
Спасибо!
Пример в axios: https://axios-http.com/docs/cancellation
Ага, про AbortController в курсе.
Обсуждают сегодня