Путаница в утечках памяти, вызванная тем, что не был удален тайм-аут в обработчиках выборки

#javascript #fetch #settimeout

Вопрос:

Я читаю сообщение в блоге на Promise.race, извлекаю и избегаю утечек памяти, и есть одна вещь, которую я не совсем понимаю

Наивная реализация, о которой он упомянул в сообщении в блоге, вызывает утечку памяти

 const request = fetch(url, options).then(response => response.json());
const timeout = new Promise((_, reject) => {
    setTimeout(() => {
        reject(new Error('Timeout'));
    }, 10000)
});

Promise.race([ request, timeout ]).then(response => {}, error => {})
 

Я понимаю, что обратный вызов проходим setTimeout содержит ссылки на обещания конструкторов функции, но я не понимаю, заключается в том, что он в куче снимков он взял в конце блога показывает, что есть много протоколу HTTP.агент и объекты, связанные гнездо получил сохраняется благодаря встроенной setTimout версия. Почему такая реализация приведет к сохранению объектов http.agent и сокетов? Я думал, что он сохранит функцию конструктора обещаний, и все.

Комментарии:

1. Я не могу точно сказать, что означает снимок, и неясно, какой именно код использовался для его создания. Вы правы, данные http не должны сохраняться во время тайм-аута.

2. Поскольку тайм-аут не очищен, обещание не очищается, поэтому Promise.race не может быть собран мусор, и это указывает на обещание, которое указывает на объект запроса. Он запустил многие из них, поэтому получил много http-объектов.

3. @RaniSharim Обещание, возвращенное, Promise.race не указывает на request() обещание, а request() обещание не указывает на объект запроса — ссылки находятся в другом направлении, от resolve функции к обещанию.

4. Обещание.гонка([ запрос, тайм-аут ])… он указывает на массив с обоими обещаниями.

5. @RaniSharim Они передаются в качестве аргументов, но нигде не хранятся для сохранения