JavaScript函数返回数组未定义。

5
我有一个叫做loadTileSet()的函数,它应该返回arrTiles(图像数据数组),但实际上返回了未定义。我使用push将数据放入数组中。
function loadTileSet(){
        var canvas = document.getElementById('fakeCanvas');
        $('#fakeCanvas').hide();
        var ctx = $("canvas")[0].getContext('2d');
        var imgTileSet = new Image();
        imgTileSet.src = 'tileset.png';
        var imageTileNumWidth = 23;
        var imageTileNumHeight = 21;

        var arrTiles = [];

        imgTileSet.onload = function(){

            var imageWidth = imgTileSet.width;
            var imageHeight = imgTileSet.height;
            sndCanvasWidth = imageWidth/imageTileNumWidth;
            sndCanvasHeight = imageHeight/imageTileNumHeight;
            canvas.width = imageWidth;
            canvas.height = imageHeight;
            ctx.drawImage(imgTileSet,0,0,imageWidth,imageHeight);

            var i=0;
            var j=0;
            var t=0;
            for(i=0;i<imageWidth;i+=sndCanvasWidth){
                for(j=0;j<imageHeight;j+=sndCanvasHeight){
                    var myImageData = ctx.getImageData(j,i,sndCanvasWidth,sndCanvasHeight); 
                    arrTiles.push(myImageData);  
                }
            }
            return arrTiles;
        }
    }

在这里,我尝试将数组放入另一个数组中

var arrNew = loadTileSet();
console.log(arrNew[0]);

2
你正在从onload处理程序中返回,而不是从loadTileSet函数中返回。 - Bergi
2
问题在于加载是异步完成的,你不能从函数中返回imageDate。请参见如何从AJAX调用中返回响应?以获取可能的解决方案。 - Bergi
2个回答

6

Bergi的评论已经指出了问题。这是一个异步过程,因此您需要将其视为一个异步过程来处理。一般的想法是使用回调函数:

function loadTileSet(callback) {
    // ...

    imgTileSet.onload = function () {
        // instead of return, do this
        callback(arrTiles);
    };
}

loadTileSet(function (arrNew) {
    // now you can use arrNew
});

0

你的函数没有返回任何东西。此外,在填充数组的地方,它被封装在那个.onload函数中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接