JavaScript が意味をなさない場合があります。x/y タイルに基づいて写真のモザイクを生成する次のコードを検討してください。各モザイク画像がダウンロードされたら、.Done プロパティを true に設定しようとしていますが、何らかの理由で常に false になっています。何が間違っていますか?
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);
}
内部で明示的に true に設定されていても、何らかの理由.Done
で、オブジェクトのプロパティtile
は常に false ですtileImage.onload = function()
。alert()
そして、この関数内に呼び出しを配置したため、この関数が呼び出されることを確認できます。tryDisplayMosaic()
現在、常に呼び出しを行う無限ループに陥っています。
また、 が呼び出される直前にループを配置tryDisplayMosaic()
し、そのループで を設定する.Done = true
と、.Done
プロパティは true にalert('All images downloaded');
なり、呼び出されます。