#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 Они передаются в качестве аргументов, но нигде не хранятся для сохранения