JavaScript - Settting property on Object in Image load function, property not set once outside funct
        Posted  
        
            by Sunday Ironfoot
        on Stack Overflow
        
        See other posts from Stack Overflow
        
            or by Sunday Ironfoot
        
        
        
        Published on 2010-05-09T15:26:26Z
        Indexed on 
            2010/05/09
            16:18 UTC
        
        
        Read the original article
        Hit count: 834
        
Sometimes JavaScript doesn't make sense to me, consider the following code that generates a photo mosaic based on x/y tiles. I'm trying to set a .Done property to true once each Mosaic image has been downloaded, but it's always false for some reason, what am I doing wrong?
var tileData = [];
function generate()
{
    var image = new Image();
    image.onload = function()
    {
        // Build up the 'tileData' array with tile objects from this Image
        for (var i = 0; i < tileData.length; i++)
        {
            var tile = tileData[i];
            var tileImage = new Image();
            tileImage.onload = function()
            {
                // Do something with this tile Image
                tile.Done = true;
            };
            tileImage.src = tile.ImageUrl;
        }
    };
    image.src = 'Penguins.jpg';
    tryDisplayMosaic();
}
function tryDisplayMosaic()
{
    setTimeout(function()
    {
        for (var i = 0; i < tileData.length; i++)
        {
            var tile = tileData[i];
            if (!tile.Done)
            {
                tryDisplayMosaic();
                return;
            }
        }
        // If we get here then all the tiles have been downloaded
        alert('All images downloaded');
    }, 2000);
}
Now for some reason the .Done property on the tile object is always false, even though it is explicitly being set to true inside tileImage.onload = function(). And I can ensure you that this function DOES get called because I've placed an alert() call inside it. Right now it's just stuck inside an infinite loop calling tryDisplayMosaic() constantly.
Also if I place a loop just before tryDisplayMosaic() is called, and in that loop I set .Done = true, then .Done property is true and alert('All images downloaded'); will get called.
© Stack Overflow or respective owner