Code: Select all
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 })
Wenn ich endlich Controller = Null zuweise, kann dieses Problem behoben werden, aber ich kenne den Grund nicht.
Was verursacht den Speicherverlust?
Mobile version