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
對象的類引用,但是當我想要同時調用該方法時會產生問題。
你爲什麼要這樣做?不應該在服務類之外傳遞延遲。這正是Promises試圖解決的問題之一。 – Creynders
爲什麼他們不應該在課外傳授? –
封裝。如果你傳遞延遲,其他一些actor可以解決或拒絕異步操作,即使它們與它無關。只有組成代理人才能訪問推遲並返回Promise。另外,客戶端不應該關心服務正在採取多少異步步驟。如果最終的承諾被退回,他們將不知道。有了Deferreds,它們不是(兩個異步進程可以並行運行,所以在這種情況下,它只能返回其中一個Deferreds,你需要返回這兩個),然後你又回到原點了。 – Creynders