2016-04-18 3 views
0

Я использую следующий код для загрузки и изменения размера изображений.Утечка памяти при загрузке изображений

$(imagesToProcess.files).each(function (idx, file) { 
        var img = new Image(); 
        img.onload = function (e) { 
         //var resized = _resizeImage(e.target); 
         URL.revokeObjectURL(e.target.src); 
        }; 
        img.src = URL.createObjectURL(file); 
       }); 

Этот код приводит к гигантским шипу памяти в Chrome, даже если я закомментировать фактическое изменение размера. Что я делаю не так?

+0

Что 'URL.revokeObjectURL()' делать? – evolutionxbox

+0

Создание функции в цикле - действительно плохая практика. Попытайтесь избежать этого во-первых –

+0

Это сообщение может вам помочь: http://stackoverflow.com/questions/7544957/memory-leak-in-javascript-when-using-new-image?rq=1 – thadam

ответ

1

Этот код, который основан на this answer, решил это для меня

    var fileQueue = []; 
        var lock = false; 
        var img = new Image(); 
        img.onload = function (e) { 
         URL.revokeObjectURL(e.target.src); 
         lock = false; 
        }; 

        $(imagesToProcess.files).each(function (idx, file) { 
         fileQueue.push(file); 
        }); 

        var processQueue = setInterval(processFile, 250); 

        function processFile() { 
         if (fileQueue.length == 0) { 
          console.log('nothing in queue'); 
          clearInterval(processQueue); 
          return; 
         } 
         if (!lock) { 
          img.src = URL.createObjectURL(fileQueue.shift()); 
          lock = true; 
         } 
        } 
0

Не используйте большую часть анонимных функций вместо использования ссылок на функции.

$(imagesToProcess.files).each(createImage); 

function createImage(idx, file){ 
    var img = new Image(); 
     img.onload = imageOnload; 
     img.src = URL.createObjectURL(file); 
} 
function imageOnload(e) { 
    URL.revokeObjectURL(e.target.src); 
} 

В коде для каждого создания изображения создается один экземпляр объекта функции. Это то, что вызывает утечку памяти в вашем коде.

+0

Код, который вы показываете, имеет тот же эффект в памяти. Поднимается вверх и вверх. – Juvaly