OK. I’ll leave it an EventDispatcher. But, should we try to emulate the callback paradigm in addition?
On Jul 5, 2016, at 3:07 PM, Josh Tynjala <joshtynj...@gmail.com> wrote: > There have been multiple cases where a developer decided to use callbacks > instead of events in their API because they felt that no one would ever > need multiple listeners, and I ended up actually needing them. The > workarounds required can be ugly. Having been there, I try to avoid making > assumptions like that in my own code. > > Just my personal experience. > > - Josh > On Jul 5, 2016 3:25 AM, "Harbs" <harbs.li...@gmail.com> wrote: > >> 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; >>> + } >>> +} >>> } >>> >>> >> >>