I’d like to start a discussion on what I did here. There is a pretty popular pattern in Javascript which allows for chaining of callbacks. Instead of lots of addEventListeners and such, you would do myClass.doSomething().success(handleSuccess).error(handleError). It’s currently giving the class object to the handler, but it could take an event object instead. I’m not sure what makes more sense.
You can also specify things like myClass.onError = handleError. This approach works very well when there’s a single object which needs the callbacks. For those types of situations, EventDispatcher is not really necessary at all. I’m thinking of removing the dependency on EventDispatcher completely for URLLoader and related classes. Requiring clients to call add and removeEventListeners is cumbersome and error-prone. Thoughts? Harbs On Jul 5, 2016, at 1:09 PM, ha...@apache.org wrote: > Repository: flex-asjs > Updated Branches: > refs/heads/develop cc22300be -> 298d2041f > > > Added callbacks > > > Project: http://git-wip-us.apache.org/repos/asf/flex-asjs/repo > Commit: http://git-wip-us.apache.org/repos/asf/flex-asjs/commit/298d2041 > Tree: http://git-wip-us.apache.org/repos/asf/flex-asjs/tree/298d2041 > Diff: http://git-wip-us.apache.org/repos/asf/flex-asjs/diff/298d2041 > > Branch: refs/heads/develop > Commit: 298d2041ff2c02c203764ed22fb11e131e4b092e > Parents: cc22300 > Author: Harbs <ha...@in-tools.com> > Authored: Tue Jul 5 13:09:05 2016 +0300 > Committer: Harbs <ha...@in-tools.com> > Committed: Tue Jul 5 13:09:05 2016 +0300 > > ---------------------------------------------------------------------- > .../flex/org/apache/flex/net/URLBinaryLoader.as | 37 +++++++-- > .../main/flex/org/apache/flex/net/URLLoader.as | 78 ++++++++++++++++++ > .../main/flex/org/apache/flex/net/URLStream.as | 86 +++++++++++++++++++- > 3 files changed, 191 insertions(+), 10 deletions(-) > ---------------------------------------------------------------------- > > > http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/298d2041/frameworks/projects/Network/src/main/flex/org/apache/flex/net/URLBinaryLoader.as > ---------------------------------------------------------------------- > diff --git > a/frameworks/projects/Network/src/main/flex/org/apache/flex/net/URLBinaryLoader.as > > b/frameworks/projects/Network/src/main/flex/org/apache/flex/net/URLBinaryLoader.as > index 2dfc490..ff9121b 100644 > --- > a/frameworks/projects/Network/src/main/flex/org/apache/flex/net/URLBinaryLoader.as > +++ > b/frameworks/projects/Network/src/main/flex/org/apache/flex/net/URLBinaryLoader.as > @@ -20,7 +20,6 @@ package org.apache.flex.net > { > > import org.apache.flex.events.Event; > - import org.apache.flex.events.EventDispatcher; > import org.apache.flex.events.ProgressEvent; > import org.apache.flex.utils.BinaryData; > > @@ -73,43 +72,63 @@ package org.apache.flex.net > { > super(); > stream = new URLStream(); > - stream.addEventListener(HTTPConstants.COMPLETE, onComplete); > + stream.addEventListener(HTTPConstants.COMPLETE, completeHandler); > } > > + /** > + * Makes the URL request. > + * > + * @langversion 3.0 > + * @playerversion Flash 10.2 > + * @playerversion AIR 2.6 > + * @productversion FlexJS 0.7.0 > + */ > public function load(request:URLRequest):void > { > stream.load(request); > } > > + /** > + * Cancels the URL request > + * > + * @langversion 3.0 > + * @playerversion Flash 10.2 > + * @playerversion AIR 2.6 > + * @productversion FlexJS 0.7.0 > + */ > public function close():void > { > stream.close(); > + //TODO do we need a callback for camceling? > } > > - private function redirectEvent(event:Event):void > - { > - dispatchEvent(event); > - } > - > - private function onComplete(event:Event):void > + private function completeHandler(event:Event):void > { > data = stream.response; > if (data) > { > dispatchEvent(event); > + if(onComplete) > + onComplete(this); > + > } > else > { > // TODO dipatch error event? > dispatchEvent(new Event(HTTPConstants.IO_ERROR)); > + if(onError) > + onError(this); > } > + cleanupCallbacks(); > } > > - private function onProgress(event:ProgressEvent):void > + private function progressHandler(event:ProgressEvent):void > { > this.bytesLoaded = event.current > this.bytesTotal = event.total; > dispatchEvent(event); > + if(onProgress) > + onProgress(this); > } > } > } > > http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/298d2041/frameworks/projects/Network/src/main/flex/org/apache/flex/net/URLLoader.as > ---------------------------------------------------------------------- > diff --git > a/frameworks/projects/Network/src/main/flex/org/apache/flex/net/URLLoader.as > b/frameworks/projects/Network/src/main/flex/org/apache/flex/net/URLLoader.as > index 809e120..102f525 100644 > --- > a/frameworks/projects/Network/src/main/flex/org/apache/flex/net/URLLoader.as > +++ > b/frameworks/projects/Network/src/main/flex/org/apache/flex/net/URLLoader.as > @@ -86,5 +86,83 @@ package org.apache.flex.net > { > throw new Error("URLLoader should not be instantiated. > Use a derived class instead.") > } > + > + protected function cleanupCallbacks():void > + { > + onComplete = null; > + onError = null; > + onProgress = null; > + } > + /** > + * Callback for complete event. > + * > + * @langversion 3.0 > + * @playerversion Flash 10.2 > + * @playerversion AIR 2.6 > + * @productversion FlexJS 0.7.0 > + */ > + public var onComplete:Function; > + > + /** > + * Callback for error event. > + * > + * @langversion 3.0 > + * @playerversion Flash 10.2 > + * @playerversion AIR 2.6 > + * @productversion FlexJS 0.7.0 > + */ > + public var onError:Function; > + > + /** > + * Callback for progress event. > + * > + * @langversion 3.0 > + * @playerversion Flash 10.2 > + * @playerversion AIR 2.6 > + * @productversion FlexJS 0.7.0 > + */ > + public var onProgress:Function; > + > + /** > + * Convenience function for complete event to allow chaining. > + * > + * @langversion 3.0 > + * @playerversion Flash 10.2 > + * @playerversion AIR 2.6 > + * @productversion FlexJS 0.7.0 > + */ > + public function complete(callback:Function):URLLoader > + { > + onComplete = callback; > + return this; > + } > + > + /** > + * Convenience function for error event to allow chaining. > + * > + * @langversion 3.0 > + * @playerversion Flash 10.2 > + * @playerversion AIR 2.6 > + * @productversion FlexJS 0.7.0 > + */ > + public function error(callback:Function):URLLoader > + { > + onError = callback; > + return this; > + } > + > + /** > + * Convenience function for progress event to allow chaining. > + * > + * @langversion 3.0 > + * @playerversion Flash 10.2 > + * @playerversion AIR 2.6 > + * @productversion FlexJS 0.7.0 > + */ > + public function progress(callback:Function):URLLoader > + { > + onProgress = callback; > + return this; > + } > } > } > \ No newline at end of file > > http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/298d2041/frameworks/projects/Network/src/main/flex/org/apache/flex/net/URLStream.as > ---------------------------------------------------------------------- > diff --git > a/frameworks/projects/Network/src/main/flex/org/apache/flex/net/URLStream.as > b/frameworks/projects/Network/src/main/flex/org/apache/flex/net/URLStream.as > index 7b5ff89..e2b1654 100644 > --- > a/frameworks/projects/Network/src/main/flex/org/apache/flex/net/URLStream.as > +++ > b/frameworks/projects/Network/src/main/flex/org/apache/flex/net/URLStream.as > @@ -107,6 +107,9 @@ package org.apache.flex.net > protected function flash_complete(event:flash.events.Event):void > { > dispatchEvent(new > org.apache.flex.events.Event(HTTPConstants.COMPLETE)); > + if(onComplete) > + onComplete(); > + cleanupCallbacks(); > } > COMPILE::SWF > protected function > flash_progress(event:flash.events.ProgressEvent):void > @@ -129,6 +132,9 @@ package org.apache.flex.net > if (xhr.readyState == 4 && xhr.status == 200) > { > dispatchEvent(new > org.apache.flex.events.Event(HTTPConstants.COMPLETE)); > + if(onComplete) > + onComplete(); > + cleanupHandlers(); > }else if (xhr.readyState==4&&xhr.status==404){ > // dispatchEvent(new > IOErrorEvent(IOErrorEvent.IO_ERROR)); > } > @@ -146,9 +152,87 @@ package org.apache.flex.net > } > > //TODO send an event that it's been aborted > + > + cleanupCallbacks(); > + > } > + private function cleanupCallbacks():void > + { > + onComplete = null; > + onError = null; > + onProgress = null; > + } > + /** > + * Callback for complete event. > + * > + * @langversion 3.0 > + * @playerversion Flash 10.2 > + * @playerversion AIR 2.6 > + * @productversion FlexJS 0.7.0 > + */ > public var onComplete:Function; > + > + /** > + * Callback for error event. > + * > + * @langversion 3.0 > + * @playerversion Flash 10.2 > + * @playerversion AIR 2.6 > + * @productversion FlexJS 0.7.0 > + */ > public var onError:Function; > - } > + > + /** > + * Callback for progress event. > + * > + * @langversion 3.0 > + * @playerversion Flash 10.2 > + * @playerversion AIR 2.6 > + * @productversion FlexJS 0.7.0 > + */ > + public var onProgress:Function; > + > + /** > + * Convenience function for complete event to allow chaining. > + * > + * @langversion 3.0 > + * @playerversion Flash 10.2 > + * @playerversion AIR 2.6 > + * @productversion FlexJS 0.7.0 > + */ > + public function > complete(callback:Function):org.apache.flex.net.URLStream > + { > + onComplete = callback; > + return this; > + } > + > + /** > + * Convenience function for error event to allow chaining. > + * > + * @langversion 3.0 > + * @playerversion Flash 10.2 > + * @playerversion AIR 2.6 > + * @productversion FlexJS 0.7.0 > + */ > + public function > error(callback:Function):org.apache.flex.net.URLStream > + { > + onError = callback; > + return this; > + } > + > + /** > + * Convenience function for progress event to allow chaining. > + * > + * @langversion 3.0 > + * @playerversion Flash 10.2 > + * @playerversion AIR 2.6 > + * @productversion FlexJS 0.7.0 > + */ > + public function > progress(callback:Function):org.apache.flex.net.URLStream > + { > + onProgress = callback; > + return this; > + } > +} > } > >