2013-05-19 45 views
2

当前我在AS3项目中使用承诺,但这也与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); 

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

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

+0

你为什么要这样做?不应该在服务类之外传递延迟。这正是Promises试图解决的问题之一。 – Creynders

+0

为什么他们不应该在课外传授? –

+0

封装。如果你传递延迟,其他一些actor可以解决或拒绝异步操作,即使它们与它无关。只有组成代理人才能访问推迟并返回Promise。另外,客户端不应该关心服务正在采取多少异步步骤。如果最终的承诺被退回,他们将不知道。有了Deferreds,它们不是(两个异步进程可以并行运行,所以在这种情况下,它只能返回其中一个Deferreds,你需要返回这两个),然后你又回到原点了。 – Creynders

回答

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; 
     } 
    } 
} 

它做得非常好!