ActionScript中的异步延迟加载

时间:2009-11-06 17:16:25

标签: actionscript-3

我无法实现此功能。基本上,我有许多需要使用URLoader加载的大块数据。我想使用延迟加载,因为急切加载占用了大量的网络资源/时间。例如:

class Foo {
    private var _resources:Array;
    public get_resource(id:String){
            if ( _resources[id] == null ){
                 //Load the resource
            }
            return _resources[id];
    }
 }

但是,上述代码仅适用于同步加载。我不希望异步暴露给程序的其他部分。我该怎么做呢?感谢。

2 个答案:

答案 0 :(得分:3)

由于异步函数立即返回(在加载完成之前), 你需要传递一个回调函数(事件处理程序)来从中获取数据。

代码可能是这样的:

class Foo {
    private var _resources:Array;
    private var _loader:Array; // holds URLLoader objects
    public get_resource(id:String, callback:Function) : void {
        if ( _loader[id] == null ){
            var ld : URLLoader = new URLLoader();

            // instead of returning value, callback function will be
            // called with retrieved data
            ld.addEventListener(Event.COMPLETE, function (ev:Event) : void {
                    _resources[id] = ev.target.data;
                    callback(ev.target.data);
                });

            ld.load (/* URLRequest here */);

            _loader[id] = ld;
        }
        // return nothing for now
    }
}

[edit] 删除了错误的评论“// URLLoader对象必须由类变量保存以避免GC”。但是仍需要_loader来记住哪个id正在加载。

答案 1 :(得分:0)

我担心你不能...... flash player是单线程的(至少对于几乎所有重要的线程),这就是为什么所有I / O操作都是异步的。

圆环提出的解决方案是你能得到的最佳解决方案。