2013-08-24 6 views
3

У меня есть функция loadTileSet(). Эта функция должна возвращать arrTiles (массив данных изображения), но функция возвращается НЕ УКАЗАНА. Я использую толчок, чтобы помещать данные в массив ..Javascript function return array undefined

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?] (Http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call) для возможных решений. – Bergi

ответ

5

В комментарии Берги уже говорится о проблеме. Это асинхронный процесс, поэтому вам нужно обрабатывать его как одно. Общая идея заключается в использовании обратного вызова:

function loadTileSet(callback) { 
    // ... 

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

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

ваша функция не возвращает ничего. Кроме того, когда вы заполняете массив, он инкапсулируется в функцию .onload.