2014-12-18 6 views
0

방금 ​​중첩 된 함수를 사용하기 시작했으며 매우 편리합니다. 그러나 나는 둘러싼 함수에 의해 나중에 반환되는 변수를 채우는 데 문제가 있습니다.함수 종료시 가변 범위?

아래 코드는 일부 BitmapData을로드하는 AIR 프로젝트를위한 코드입니다. 내 변수 ("bitmapData")는 loaderComplete 함수에 채워질 것이라고 예상했지만 항상 null로 반환됩니다. 그러나 내 trace 문에서 이미지 크기가 기록되므로 명확하게 읽었습니다.

내 구문이나 나의 이해에 문제가 있나요 (또는 둘 다 ;-)

 private function getBitmapData(url:String):BitmapData 
     { 
      var bitmapData:BitmapData; 
      var bytes:ByteArray = getByteArray(url); 
      if (bytes == null){ 
       trace("bytes null"); 
       return null; 
      } 

      var loader:Loader = new Loader(); 
      loader.loadBytes(bytes); 
      loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaderComplete); 
      loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorListener); 

      function loaderComplete(event:Event):void 
      { 
       loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, loaderComplete); 
       loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, ioErrorListener); 
       var loaderInfo:LoaderInfo = LoaderInfo(event.target); 
       trace("loader",loaderInfo.width, loaderInfo.height); 
       bitmapData = new BitmapData(loaderInfo.width, loaderInfo.height, false, 0xFFFFFF); 
       trace("bitmapData.rect", bitmapData.rect); 
       bitmapData.draw(loaderInfo.loader); 
      } 

      function ioErrorListener(event:IOErrorEvent):void 
      { 
       trace("ioErrorListener", event.errorID); 
       loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, loaderComplete); 
       loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, ioErrorListener); 
      } 
      return bitmapData; 
     }  

 public function getByteArray(url:String):ByteArray{ 
      var byteFile:File = new File(url); 
      if(byteFile.exists && !byteFile.isDirectory){ 
       var fileStream:FileStream = new FileStream(); 
       fileStream.open(byteFile, FileMode.READ); 
       var tempBytes: ByteArray = new ByteArray(); 
       fileStream.readBytes(tempBytes); 
       fileStream.close(); 
       return tempBytes; 
      } else { 
       trace("file doesnt exist"); 
       return null; 
      } 
     } 

답변

0

Loader.loadBytes() 비동기 방법이다. 이벤트는 loadBytes 호출과 동일한 프레임에서 실행되지 않습니다. 따라서 실제로 bitmapData 앞에 넣으려고 시도하면 loaderComplete 코드가 실행됩니다.

콜백을 사용하여 할 수 있습니다. 답장을

private function getBitmapData(url:String, callback:Function):void 
{ 
    var bitmapData:BitmapData; 
    var bytes:ByteArray = getByteArray(url); 
    if (bytes == null){ 
     trace("bytes null"); 
     callback(null); 
    } 

    var loader:Loader = new Loader(); 
    loader.loadBytes(bytes); 
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaderComplete); 
    loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorListener); 

    function loaderComplete(event:Event):void 
    { 
     loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, loaderComplete); 
     loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, ioErrorListener); 
     var loaderInfo:LoaderInfo = LoaderInfo(event.target); 
     trace("loader",loaderInfo.width, loaderInfo.height); 
     bitmapData = new BitmapData(loaderInfo.width, loaderInfo.height, false, 0xFFFFFF); 
     trace("bitmapData.rect", bitmapData.rect); 
     bitmapData.draw(loaderInfo.loader); 
     callback(bitmapData) 
    } 

    function ioErrorListener(event:IOErrorEvent):void 
    { 
     trace("ioErrorListener", event.errorID); 
     loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, loaderComplete); 
     loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, ioErrorListener); 
    } 
}  

private function handleNewBitmapData(bitmapData:BitmapData):void 
{ 
    trace("handled bitmapData.rect", bitmapData.rect); 
} 

getBitmapData("[some url]", handleNewBitmapData); 
+0

덕분에 예를 들어, 당신은 loaderComplete에 그 함수를 호출 한 후 getBitmapData에서 매개 변수로 함수에 대한 참조를 통과 할 수 있습니다. 나는 그것을 얻는다라고 생각한다. –