处理事件监听器时处理promise

时间:2013-05-19 09:49:39

标签: actionscript-3 promise deferred

目前我在AS3项目中使用promises,但这也与JS项目相关。

AS3中说我有这段代码:

public function getFeed():Promise
{
    var request:URLRequest = new URLRequest(END_POINT);
    var loader:URLLoader = new URLLoader();
    var dfd:Deferred = new Deferred();

    loader.addEventListener(Event.COMPLETE, handleGetFeedReady, false, 0, true);

    loader.load(request);

    return dfd.promise;
}

private function handleGetFeedReady(e:Event):void
{
    e.target.removeEventListener(Event.COMPLETE, handleGetFeedReady);

    vo.entries = JSON.decode(e.target.data);

    // resolve the dfd here
}

我想以某种方式将dfd(延迟)对象传递给我的事件处理程序。现在我知道我可以使用像这样的匿名函数:

loader.addEventListener(Event.COMPLETE, function(e:Event):void
{
    handleGetFeedReady(dfd, e);   
}, false, 0, true);

但是我想避免使用每次调用父方法时创建的匿名函数(也许我太肛门)。

另一种选择可能是创建对dfd对象的类引用,但是当我想同时调用该方法时,这会产生问题。

1 个答案:

答案 0 :(得分:0)

所以这是一个潜在的答案,不确定它是否是正确的方法,但它现在适合问题和项目:我扩展了URLLoader并添加了一个相对于保存dfd对象的加载器,如下所示:

package com.domain
{
    import com.codecatalyst.promise.Deferred;

    import flash.net.URLLoader;
    import flash.net.URLRequest;

    public class URLDeferredLoader extends URLLoader
    {
        private var _dfd:Deferred;

        public function URLDeferredLoader(dfd:Deferred, request:URLRequest=null)
        {
            super(request);

            this._dfd = dfd;
        }

        public function get dfd():Deferred
        {
            return _dfd;
        }
    }
}

它做得很好!