You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@flex.apache.org by Harbs <ha...@gmail.com> on 2016/07/05 10:25:06 UTC
Re: git commit: [flex-asjs] [refs/heads/develop] - Added callbacks
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, harbs@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;
> + }
> +}
> }
>
>
Re: git commit: [flex-asjs] [refs/heads/develop] - Added callbacks
Posted by Harbs <ha...@gmail.com>.
Sorry about that. I thought I built it before committing, but I apparently forgot.
I’ll commit the fixed code shortly.
On Jul 5, 2016, at 3:44 PM, Christofer Dutz <ch...@c-ware.de> wrote:
> It seems that on line 136 of URLStream it should be "cleanupCallbacks()" instead of "cleanupHandlers()". At least when doing that change, the build passes, but I didn't deeply look into your change, so I won't commit that change and eventually break your stuff.
>
>
> Chris
>
> ________________________________
> Von: Christofer Dutz <ch...@c-ware.de>
> Gesendet: Dienstag, 5. Juli 2016 14:35:23
> An: dev@flex.apache.org
> Betreff: AW: git commit: [flex-asjs] [refs/heads/develop] - Added callbacks
>
> And could you please have a look at the build? Seems the Maven build is failing now ...
>
> https://builds.apache.org/view/E-G/view/Flex/job/flex-asjs%20(maven)/90/console
>
>
> Chris
>
> ________________________________
> Von: Josh Tynjala <jo...@gmail.com>
> Gesendet: Dienstag, 5. Juli 2016 14:07:17
> An: dev@flex.apache.org
> Betreff: Re: git commit: [flex-asjs] [refs/heads/develop] - Added callbacks
>
> 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" <ha...@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, harbs@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;
>>> + }
>>> +}
>>> }
>>>
>>>
>>
>>
AW: git commit: [flex-asjs] [refs/heads/develop] - Added callbacks
Posted by Christofer Dutz <ch...@c-ware.de>.
It seems that on line 136 of URLStream it should be "cleanupCallbacks()" instead of "cleanupHandlers()". At least when doing that change, the build passes, but I didn't deeply look into your change, so I won't commit that change and eventually break your stuff.
Chris
________________________________
Von: Christofer Dutz <ch...@c-ware.de>
Gesendet: Dienstag, 5. Juli 2016 14:35:23
An: dev@flex.apache.org
Betreff: AW: git commit: [flex-asjs] [refs/heads/develop] - Added callbacks
And could you please have a look at the build? Seems the Maven build is failing now ...
https://builds.apache.org/view/E-G/view/Flex/job/flex-asjs%20(maven)/90/console
Chris
________________________________
Von: Josh Tynjala <jo...@gmail.com>
Gesendet: Dienstag, 5. Juli 2016 14:07:17
An: dev@flex.apache.org
Betreff: Re: git commit: [flex-asjs] [refs/heads/develop] - Added callbacks
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" <ha...@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, harbs@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;
> > + }
> > +}
> > }
> >
> >
>
>
AW: git commit: [flex-asjs] [refs/heads/develop] - Added callbacks
Posted by Christofer Dutz <ch...@c-ware.de>.
And could you please have a look at the build? Seems the Maven build is failing now ...
https://builds.apache.org/view/E-G/view/Flex/job/flex-asjs%20(maven)/90/console
Chris
________________________________
Von: Josh Tynjala <jo...@gmail.com>
Gesendet: Dienstag, 5. Juli 2016 14:07:17
An: dev@flex.apache.org
Betreff: Re: git commit: [flex-asjs] [refs/heads/develop] - Added callbacks
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" <ha...@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, harbs@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;
> > + }
> > +}
> > }
> >
> >
>
>
Re: git commit: [flex-asjs] [refs/heads/develop] - Added callbacks
Posted by Josh Tynjala <jo...@gmail.com>.
The callback paradigm could still be a convenient option. There definitely
are times when a single listener is all you need.
- Josh
On Tue, Jul 5, 2016 at 7:08 AM, Harbs <ha...@gmail.com> wrote:
> 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 <jo...@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" <ha...@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, harbs@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;
> >>> + }
> >>> +}
> >>> }
> >>>
> >>>
> >>
> >>
>
>
Re: git commit: [flex-asjs] [refs/heads/develop] - Added callbacks
Posted by Harbs <ha...@gmail.com>.
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 <jo...@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" <ha...@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, harbs@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;
>>> + }
>>> +}
>>> }
>>>
>>>
>>
>>
Re: git commit: [flex-asjs] [refs/heads/develop] - Added callbacks
Posted by Josh Tynjala <jo...@gmail.com>.
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" <ha...@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, harbs@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;
> > + }
> > +}
> > }
> >
> >
>
>