Нужно ли удалять прослушиватели событий для FileReader () после того, как я закончу с этим? - PullRequest
1 голос
/ 07 июня 2019

У меня есть компонент с <input type='file'/> для выбора и загрузки изображений в мое хранилище.

Я использую FileReader().readAsText(file);, который является асинхронным, и я настраиваю слушателей на события onload и onerror.

От: https://developer.mozilla.org/en-US/docs/Web/API/FileReader

Прослушайте эти события, используя addEventListener () или назначив прослушиватель событий свойству oneventname этого интерфейса.

Это выполняется каждый раз, когда пользователь выбирает файл. Я вычисляю md5 хеш для использования в качестве fileName в хранилище.

if (newFile !== undefined && newFile !== null) {
  md5Hash = await new Promise((resolve,reject) => {

    const reader = new FileReader();

    reader.onload = (event) => {
      console.log('md5 calculated!');
      const binary = event.target.result;
      resolve(md5(binary));
    };

    reader.onerror = (event) => {
      reject(event.target.result);
    };

    reader.readAsText(newFile);

  });
}

Нужно ли мне беспокоиться об удалении этих слушателей после того, как я закончу с ними? Это хорошая практика или нет никакого смысла в этом?

Этот код может запускаться 5 или 6 раз для разных изображений, которые я загружаю на одной странице.

ПРИМЕЧАНИЕ: Это страница для добавления blogPosts и изображений для сообщений.

Ответы [ 2 ]

2 голосов
/ 07 июня 2019

Нет, в этом нет необходимости.В конце концов, читатель и функции будут иметь ссылки только друг на друга… но ничто иное не будет иметь ссылок на любой из них, и поэтому все они могут быть собраны мусором.


¹ И если механизм JavaScript оптимизируетте замыкания, которые многие делают, только reader имеет ссылку на функции, а не наоборот, как вы их написали.

1 голос
/ 07 июня 2019

В вашем текущем примере -

Почему вы заботитесь о listeners, поскольку это вызывает утечки памяти

Я скажу Нет , вам на самом деле не нужноудалите listener, как это определено в вашем Promise callback fn, и когда этот fn будет выполнен, JavaScript Engine создает контекст выполнения и определяет его переменную среды, а затем выделяет память.Эта память освобождается сборщиком мусора после выполнения fn и удаления из callstack, поскольку ссылки на расположение в памяти также ограничиваются fn, так что очищаются после выполнения fn.

Однако в общем случае я бы сказал Да , вам следует позаботиться о listeners, так как это лучший метод для возможных проблем с утечками памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...