在ActionScript3中返回父函数? (或使addEventListener返回)

时间:2009-08-21 15:03:51

标签: flash actionscript-3 return-value return

基本上我有一个代码应该加载很多图像所以我需要一个函数来加载它们。问题是addEventListener需要一个在引发事件时调用的函数。

我需要找到一种方法来使loadImage函数在引发事件后返回 ONLY ,或者在addEventListener中引发函数以返回它的父函数。

    function loadImage(imagePath:String)//:BitmapData
    {
            var internalLoader:Loader = new Loader();

            var internalImageRequest = new URLRequest(imagePath); 

            var loadingComplete:Boolean = false;

            internalLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, 
                                                              function (event:Event):void
                                                              {
                                                                loadingComplete = true;
                                                              }
                                                              );
            internalLoader.load(internalImageRequest);



            //I need to wait 'till the event have been raised and then RETURN , NOT BEFORE THAT
            //var tempImg:Bitmap = Bitmap(internalLoader.content);
            //return tempImg.bitmapData;
    }

提前致谢

3 个答案:

答案 0 :(得分:2)

简短回答:放弃,不会发生这种情况。

答案很长:这里的问题是你永远不想让Flash Player挂起。原因很多,但都归结为你总是在UI线程中运行。像你这样的网络请求意味着你必须等待加载图像,这会在等待时挂起UI,从而使用户烦恼。如果图像很小并且网络效率不是问题,那么这对您来说不是问题。但是,如果图像需要一段时间才能加载,问题就会出现问题。此外,如果我没记错的话,Flash Player会限制每帧的代码执行时间,15秒。之后,用户会弹出一个弹出窗口,询问是否应该中止脚本。

我建议你做的是定义一个事件处理程序,它可以处理你从加载器获得的BitmapData对象所需的任何内容。

function loadImage(imagePath:String):void
{
    var internalLoader:Loader = new Loader();
    var internalImageRequest = new URLRequest(imagePath); 

    var loadingComplete:Boolean = false;

    internalLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoad);
    internalLoader.load(internalImageRequest);
}

function onLoad(event:Event):void
{
    // Do whatever you need to do with the loader here
    var contentLoaderInfo:LoaderInfo = LoaderInfo(event.target);
}

答案 1 :(得分:0)

不幸的是,这是不可能的。您需要父函数注册的事件。然后当加载程序完成加载时,它会引发事件。您可以在eventargs中传递位图数据。

function (event:Event):void 
{
    loadingComplete = true;
    dispatchEvent([Your Event]);
}

您的父母需要听[您的活动]并做任何需要的事情。

答案 2 :(得分:0)

你也可以尝试延续传球风格:

function loadImage(path:String, result:Function):void {
    var l:Loader = new Loader();
    l.load(new URLRequest(path));
    l.contentLoaderInfo.addEventListener(Event.COMPLETE, function(event:Event):void {
        result(Bitmap(l.content).bitmapData);
    });
    // If you want to handle IO errors, otherwise this effectively never "returns".
    l.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, function(event:Event):void {
        result(null);
    });
}

function process(path:String):void {
    loadImage(path, function(data:BitmapData):void {
        ...
    }
}

当你必须链接多个函数时,这会非常痛苦,所以你可以打破标准格式:

function process(path:String):void {
    loadImage(path, function(
    data:BitmapData):void { // Async "result declaration"

    longProcessing(data, function(
    result:ProcessingResult):void {

    // Can use data and result here...
}}} // Have to close continuations as well as process