Anonymous
Следующий код vue приведет к утечке памяти, но я не знаю причину
Сообщение
Anonymous » 05 янв 2026, 12:41
Код: Выделить всё
import { ref, onMounted, onBeforeUnmount, toRefs } from 'vue'
const props = defineProps({
sessionUrl: { type: String, required: true },
offerData: { type: Object, required: true }
})
const { sessionUrl, offerData } = toRefs(props)
const httpIntervalId = ref(null)
const fetchControllers = ref([])
const MAX_CONCURRENT = 3
const sendHttpRequest = async (candidates) => {
if (fetchControllers.value.length >= MAX_CONCURRENT) return
const controller = new AbortController()
fetchControllers.value.push(controller)
try {
const res = await fetch(sessionUrl.value, {
method: 'PATCH',
headers: {
'Content-Type': 'application/trickle-ice-sdpfrag',
'If-Match': '*'
},
body: generateSdpFragment(offerData.value, candidates),
signal: controller.signal
})
} catch (err) {
if (err.name === 'AbortError') {
} else {
console.error('fetch error', err)
}
} finally {
const idx = fetchControllers.value.indexOf(controller)
if (idx !== -1) fetchControllers.value.splice(idx, 1)
}
}
const cancelHttpRequest = (msg) => {
if (!fetchControllers.value || fetchControllers.value.length === 0) return
const controllers = fetchControllers.value.slice()
controllers.forEach((c) => {
try { c.abort() } catch (e) { /* ignore */ }
})
fetchControllers.value = []
}
const generateSdpFragment = (offerData, candidates) => {
return ''
}
onMounted(() => {
if (httpIntervalId.value) {
clearInterval(httpIntervalId.value)
httpIntervalId.value = null
}
httpIntervalId.value = setInterval(() => {
sendHttpRequest()
}, 5000)
})
onBeforeUnmount(() => {
if (httpIntervalId.value) {
clearInterval(httpIntervalId.value)
httpIntervalId.value = null
}
cancelHttpRequest()
})
defineExpose({ cancelHttpRequest })
Я написал этот код для выполнения HTTP-запроса в приложении VUE и использую AbortController для отмены запроса, эти AbortControllers будут помещены в ref([]), но это вызовет утечку памяти, и я не знаю причину.
Если я назначу контроллер = null, наконец, эту проблему можно исправить, но я не знаю причину.
Что вызывает утечку памяти?>
Подробнее здесь:
https://stackoverflow.com/questions/798 ... the-reason
1767606118
Anonymous
[code] import { ref, onMounted, onBeforeUnmount, toRefs } from 'vue' const props = defineProps({ sessionUrl: { type: String, required: true }, offerData: { type: Object, required: true } }) const { sessionUrl, offerData } = toRefs(props) const httpIntervalId = ref(null) const fetchControllers = ref([]) const MAX_CONCURRENT = 3 const sendHttpRequest = async (candidates) => { if (fetchControllers.value.length >= MAX_CONCURRENT) return const controller = new AbortController() fetchControllers.value.push(controller) try { const res = await fetch(sessionUrl.value, { method: 'PATCH', headers: { 'Content-Type': 'application/trickle-ice-sdpfrag', 'If-Match': '*' }, body: generateSdpFragment(offerData.value, candidates), signal: controller.signal }) } catch (err) { if (err.name === 'AbortError') { } else { console.error('fetch error', err) } } finally { const idx = fetchControllers.value.indexOf(controller) if (idx !== -1) fetchControllers.value.splice(idx, 1) } } const cancelHttpRequest = (msg) => { if (!fetchControllers.value || fetchControllers.value.length === 0) return const controllers = fetchControllers.value.slice() controllers.forEach((c) => { try { c.abort() } catch (e) { /* ignore */ } }) fetchControllers.value = [] } const generateSdpFragment = (offerData, candidates) => { return '' } onMounted(() => { if (httpIntervalId.value) { clearInterval(httpIntervalId.value) httpIntervalId.value = null } httpIntervalId.value = setInterval(() => { sendHttpRequest() }, 5000) }) onBeforeUnmount(() => { if (httpIntervalId.value) { clearInterval(httpIntervalId.value) httpIntervalId.value = null } cancelHttpRequest() }) defineExpose({ cancelHttpRequest }) [/code] Я написал этот код для выполнения HTTP-запроса в приложении VUE и использую AbortController для отмены запроса, эти AbortControllers будут помещены в ref([]), но это вызовет утечку памяти, и я не знаю причину. Если я назначу контроллер = null, наконец, эту проблему можно исправить, но я не знаю причину. Что вызывает утечку памяти?> Подробнее здесь: [url]https://stackoverflow.com/questions/79860643/following-vue-code-will-cause-memory-leak-but-i-dont-know-the-reason[/url]