flex-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Harbs <harbs.li...@gmail.com>
Subject Re: git commit: [flex-asjs] [refs/heads/develop] - Added callbacks
Date Tue, 05 Jul 2016 10:25:06 GMT
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 <harbs@in-tools.com>
> Authored: Tue Jul 5 13:09:05 2016 +0300
> Committer: Harbs <harbs@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;
> +		}
> +}
> }
> 
> 


Mime
View raw message