Как правильно уничтожить RTCPeerConnection в JavaScript?
Когда я создаю new RTCPeerConnection()
Насколько я вижу, я не могу уничтожить его с помощью peer.close(), и через некоторое время у меня заканчиваются ресурсы. Когда веб-страница создает много RTCPeerConnection
s, он перестает работать после примерно 600 попыток и выдает следующую ошибку в Chrome:
Uncaught DOMException: не удалось создать 'RTCPeerConnection': невозможно создать так много PeerConnections
Вот тестовый скрипт, который поможет вам получить ошибку. Это только для иллюстрации, проблема возникает, даже если узлы создаются гораздо медленнее:
var i = 1;
function peer() {
var peer = new RTCPeerConnection();
setTimeout(() => {
peer.close();
peer=null;
}, 10);
console.log(i++);
}
setInterval(peer, 20);
// run the script and wait on console to see the error
Я ожидаю, что он освободит все ресурсы при вызове peer.close () или, по крайней мере, когда peer установлен в null, поэтому я не вижу причин, по которым браузер выдает ошибку, что существует так много PeerConnections. Я что-то делаю неправильно? Как правильно уничтожить пира? Спасибо
2 ответа
Попробуйте установить peer в null, чтобы он собирал мусор. Смотрите эти заметки от человека, который ввел ограничение. Если это не работает, спросите в этой ветке списка рассылки
Хорошо, это была запутанная тайна, к счастью, она решена, я постараюсь привести вам пример, чтобы любой, кто читает этот пост, мог понять, что именно происходит.
Предположим, что вы создали свою собственную программу, которая может считать файлы в одной папке, и вы приказали программе считать файлы в папке C:\Files.
этот путь к папке содержит 500 файлов. программа будет считывать максимум 500 часов, это его максимальная способность, поэтому вы даете ему приказ и нажимаете ввод.
через час вы вернулись, увидели, что программа ( Dead), вы исследуете, в чем проблема? затем вы обнаружите, что, поскольку его максимальная способность читать 500 файлов в час и в папке, содержащей 500 файлов, он никак не может сделать ошибку, но ошибка появилась, потому что есть кто-то, кто продолжает бросать файлы в эту папку с бесконечным циклом, его как будто ему требуется 1 секунда, чтобы прочитать файл, и в течение той же одной секунды еще 5 файлов поступают накапливающимся образом, он начинает считать и считать, пока новые файлы подсчитываются кумулятивно.
это именно то, что происходит в вашем случае, браузер chrome закрывает одноранговое соединение через одну секунду, и в течение этой одной секунды вы запускаете ему 3-4 новых одноранговых соединения, что делает браузер chrome через некоторое время, отмечая ошибку на консоли, потому что вычисление на фоне консоли показывает, что это бесконечность, и она покажет ошибку стека рано или поздно. часть того, что вы заполняете кеш вашего браузера, устанавливая интервал времени с этими значениями.
Я прослеживал это почти три часа, и это результат, который я в итоге получаю. я скоро отредактирую этот пост и добавлю решение о том, как его решить.
Хорошо, я только что закончил настройку кода, вот что я получаю в результате выполнения снип-кода и скажите мне, если вы видите ошибки в примечании к консоли chrome: вы можете удалить sip-java-скрипт, я использовал его для отслеживания вашей ошибки.
надеюсь, мой пост поможет кому-то в будущем.
удачи
<script src="http://sipjs.com/download/sip-0.7.2.min.js"></script>
<meta http-equiv="Expires" content="0">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-control" content="no-cache">
<meta http-equiv="Cache" content="no-cache">
<script>
var i = 1;
function peer() {
var peer = new RTCPeerConnection();
peer.mediaHandler = null;
peer.onicecandidate = null;
peer.onaddstream = null;
peer.close(i);
setTimeout(() => {
console.log('Ending Call');
}, 3500);
console.log(i++);
}
setInterval(peer, 500);
hangUp = () => {
let { peer} = this.state;
peer.close();
this.setState({
peer: null,
});
};
</script>