Ответ 1
Предисловие (вы, вероятно, знаете это!):
await
- синтаксический сахар для использования обещаний обратных вызовов. (Действительно, действительно, действительно хороший сахар.) Функция async
- это функция, в которой движок JavaScript создает цепочки обещаний и тому подобное для вас.
Ответ:
Речь идет не столько о том, выполнено ли обещание, сколько о том, хранятся ли в памяти обратные вызовы (и то, на что они ссылаются/закрываются). Пока обещание находится в памяти и не установлено, оно имеет ссылку на свои функции обратного вызова, сохраняя их в памяти. Две вещи заставляют эти ссылки исчезнуть:
- Выполнение обещания или
- Освобождение всех ссылок на обещание, что делает его подходящим для GC (возможно, подробнее ниже)
В обычном случае потребитель обещания подключает обработчики к обещанию, а затем либо вообще не сохраняет ссылку на него, либо сохраняет ссылку на него только в контексте, в котором функции обработчика закрываются, а не где-либо еще. (Вместо того, чтобы, например, хранить ссылку на обещание в свойстве объекта с длительным сроком действия.)
Предполагая, что реализация debounce освобождает ссылку на обещание, которое никогда не будет выполнено, и потребитель обещания не сохранил ссылку где-то за пределами этого цикла взаимных ссылок, тогда обещание и обработчики, зарегистрированные для него (и все, что они содержат единственную ссылку для) могут быть собраны мусором, как только ссылка на обещание будет выпущена.
Это требует изрядного внимания со стороны реализации. Например (спасибо Киту за пометку этого), если обещание использует обратный вызов для какого-то другого API (например, addEventListener
), и обратный вызов закрывается по ссылке на обещание, так как другой API содержит ссылку на обратный вызов, которая может помешать освобождению всех ссылок на обещание и, таким образом, сохранить в памяти все, на что ссылается обещание (например, его обратные вызовы).
Так что это будет зависеть от тщательности реализации и от потребителя. Можно было бы написать код, который содержал бы ссылки на обещания и, таким образом, вызывал бы утечку памяти, но в обычном случае я бы не ожидал, что это сделает потребитель.