<?xml version="1.0" encoding="utf-8"?>
			
			<rss version="2.0">
			<channel>
			<title>Notes from the Flex Flash and ColdFusion Trenches - datamanager</title>
			<link>http://blogs.digitalprimates.net/jefftapper/index.cfm</link>
			<description>Jeff Tapper&apos;s Blog</description>
			<language>en-us</language>
			<pubDate>Mon, 06 Sep 2010 14:24:50 -0400</pubDate>
			<lastBuildDate>Fri, 21 Apr 2006 21:54:00 -0400</lastBuildDate>
			<generator>BlogCFC</generator>
			<docs>http://blogs.law.harvard.edu/tech/rss</docs>
			<managingEditor>jtapper@digitalprimates.net (Jeff Tapper)</managingEditor>
			<webMaster>jtapper@digitalprimates.net (Jeff Tapper)</webMaster>
			
			<item>
				<title>Updates to the AS3 DataManager</title>
				<link>http://blogs.digitalprimates.net/jefftapper/index.cfm?mode=entry&amp;entry=A810F731-C482-5BC9-B6565D759C2F6A5B</link>
				<description>
				
				&lt;p&gt;A customer of mine found a bug my &lt;a href=&quot;http://jeff.mxdj.com/as3_datamanager.htm&quot;&gt;AS3&amp;#160;DataManager &lt;/a&gt;when making multiple simultaneous calls.&amp;#160; Here is the fix to the bug. &lt;/p&gt;
&lt;p&gt;The issue is that while the DataManager allows calls to many methods in a web service, each instance of the DataManager only has a single eventName property.&amp;#160; I was able to work around this by making use of hte AsyncToken, which is returned whenever a call to an AbstractOperation (such as a WebService) is made.&amp;#160; The AsyncToken is carried along with the request and available when results happen as part of the ResultEvent.&amp;#160; Even better, its a dynamic class, so you can add any arbitrary properties on it you want.&amp;#160; So, to fix the issue, replace the existing makeRemoteCall method with this:&lt;/p&gt;
&lt;pre&gt;public function makeRemoteCall(methodName:String,eventName:String, args:Object):void{&lt;br /&gt;&amp;#160;trace(&amp;quot;DataManager.makeRemoteCall(&amp;quot;+methodName+&amp;quot;,&amp;quot;+eventName+&amp;quot;,&amp;quot;+args+&amp;quot;)&amp;quot;);&lt;br /&gt;&amp;#160;this.eventName = eventName;&lt;br /&gt;&amp;#160;var op:mx.rpc.AbstractOperation = ws[methodName];&lt;br /&gt;&amp;#160;ws.addEventListener(&amp;quot;result&amp;quot;,doResults);&lt;br /&gt;&amp;#160;ws.addEventListener(&amp;quot;fault&amp;quot;,doFault);&lt;br /&gt;&amp;#160;&lt;br /&gt;&amp;#160;if(args){&lt;br /&gt;&amp;#160;&amp;#160;op.arguments = args;&lt;br /&gt;&amp;#160;}&lt;br /&gt;&amp;#160;&lt;br /&gt;&amp;#160;var token:AsyncToken = op.send();&lt;br /&gt;&amp;#160;token.eventName = eventName;&lt;br /&gt;}&lt;/pre&gt;
&lt;pre&gt;private function doResults(event:ResultEvent):void{&lt;br /&gt;&amp;#160;var e:DataManagerResultEvent = new DataManagerResultEvent( event.token.eventName, event.result);&lt;br /&gt;&amp;#160;this.dispatchEvent(e);&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;Now, the event names is stored with&amp;#160;the request, so we have access to a different event name for each request&amp;#160;made!&amp;#160; The completed code looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;br /&gt;package managers {&lt;br /&gt;&amp;#160;&amp;#160;import flash.events.EventDispatcher;&lt;br /&gt;&amp;#160;&amp;#160;import mx.rpc.soap.WebService;&lt;br /&gt;&amp;#160;&amp;#160;import mx.rpc.events.ResultEvent;&lt;br /&gt;&amp;#160;&amp;#160;import mx.rpc.events.FaultEvent;&lt;br /&gt;&amp;#160;&amp;#160;import mx.rpc.AbstractOperation;&lt;br /&gt;&amp;#160;&amp;#160;import events.DataManagerResultEvent;&lt;br /&gt;&amp;#160;&amp;#160;import flash.util.*&lt;br /&gt;&amp;#160;&amp;#160;import mx.rpc.AsyncToken;;&lt;/pre&gt;
&lt;pre&gt;&amp;#160;&amp;#160;/**&amp;#160; DataManager - singleton class which enforces only&lt;br /&gt;&amp;#160;&amp;#160;a single object is created for eachwsdl.&amp;#160; To&lt;br /&gt;&amp;#160;&amp;#160;access DataManager, use getDataManager(wsdl:String) */&lt;/pre&gt;
&lt;pre&gt;&amp;#160;&amp;#160;public class DataManager extends EventDispatcher {&lt;br /&gt;&amp;#160;&amp;#160;private var ws:WebService;&lt;br /&gt;&amp;#160;&amp;#160;private var eventName:String;&lt;br /&gt;&amp;#160;&amp;#160;// hashmap of instances for each wsdl&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;private static var instanceMap:Object = new Object();&lt;br /&gt;&amp;#160;&amp;#160;private static var methodEventMap:Object = new Object();&lt;/pre&gt;
&lt;pre&gt;&amp;#160;&amp;#160;public function DataManager(pri:PrivateClass, wsdl:String){&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;this.ws = new WebService();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;ws.wsdl = wsdl;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;ws.loadWSDL();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;ws.useProxy = false;&lt;br /&gt;&amp;#160;&amp;#160;}&lt;/pre&gt;
&lt;pre&gt;&amp;#160;&amp;#160;public static function getDataManager(wsdl:String):DataManager{&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;if(DataManager.instanceMap[wsdl] == null){&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;DataManager.instanceMap[wsdl] = new DataManager(new PrivateClass(),wsdl);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;var dm:DataManager= DataManager.instanceMap[wsdl];&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;if(dm.ws.canLoadWSDL()){&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;return dm;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;} else {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;throw new Error(&amp;quot;BAD WSDL:&amp;quot;+wsdl);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&amp;#160;&amp;#160;}&lt;br /&gt;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;public function makeRemoteCall(methodName:String,eventName:String, args:Object):void{&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;trace(&amp;quot;DataManager.makeRemoteCall(&amp;quot;+methodName+&amp;quot;,&amp;quot;+eventName+&amp;quot;,&amp;quot;+args+&amp;quot;)&amp;quot;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;this.eventName = eventName;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;var op:mx.rpc.AbstractOperation = ws[methodName];&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;ws.addEventListener(&amp;quot;result&amp;quot;,doResults);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;ws.addEventListener(&amp;quot;fault&amp;quot;,doFault);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;if(args){&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;op.arguments = args;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;var token:AsyncToken = op.send();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;token.eventName = eventName;&lt;br /&gt;&amp;#160;&amp;#160;}&lt;br /&gt;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;private function doResults(event:ResultEvent):void{&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;var e:DataManagerResultEvent = new DataManagerResultEvent( event.token.eventName, event.result);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;this.dispatchEvent(e);&lt;br /&gt;&amp;#160;&amp;#160;}&lt;br /&gt;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;private function doFault(fault:FaultEvent):void{&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;trace(&amp;quot;DataManager.doFault(&amp;quot;+fault.fault.faultString+&amp;quot;)&amp;quot;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;this.dispatchEvent(fault);&lt;br /&gt;&amp;#160;&amp;#160;}&lt;br /&gt;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;public override function toString():String{&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;return &amp;quot;DataManager&amp;quot;;&lt;br /&gt;&amp;#160;&amp;#160;}&lt;br /&gt;&amp;#160;}&lt;br /&gt;}&lt;br /&gt;&amp;#160;/**&amp;#160; PrivateClass is used to make&amp;#160;&amp;#160; DataManager constructor private */&lt;br /&gt;class PrivateClass{&lt;br /&gt;&amp;#160;public function PrivateClass() {&lt;br /&gt;&amp;#160;}&lt;br /&gt;}&lt;br /&gt;&amp;#160;&lt;/pre&gt; 
				</description>
				
				<category>datamanager</category>				
				
				<category>webservice</category>				
				
				<category>flex2</category>				
				
				<category>as3</category>				
				
				<category>soap</category>				
				
				<pubDate>Fri, 21 Apr 2006 21:54:00 -0400</pubDate>
				<guid>http://blogs.digitalprimates.net/jefftapper/index.cfm?mode=entry&amp;entry=A810F731-C482-5BC9-B6565D759C2F6A5B</guid>
				
			</item>
			</channel></rss>