2013-05-19 36 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; 
     } 
    } 
} 

它做得非常好!