﻿<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Digital Primates&#187; datamanager</title>
	<atom:link href="http://www.digitalprimates.net/author/category/datamanager/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.digitalprimates.net</link>
	<description>Development and Consulting</description>
	<lastBuildDate>Thu, 06 Jun 2013 18:13:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>Updates to the AS3 DataManager</title>
		<link>http://www.digitalprimates.net/author/tapper/2006/04/21/updates-to-the-as3-datamanager/</link>
		<comments>http://www.digitalprimates.net/author/tapper/2006/04/21/updates-to-the-as3-datamanager/#comments</comments>
		<pubDate>Fri, 21 Apr 2006 16:04:00 +0000</pubDate>
		<dc:creator>tapper</dc:creator>
				<category><![CDATA[as3]]></category>
		<category><![CDATA[datamanager]]></category>
		<category><![CDATA[flex2]]></category>
		<category><![CDATA[soap]]></category>
		<category><![CDATA[webservice]]></category>

		<guid isPermaLink="false">http://test.digitalprimates.net/2006/04/21/updates-to-the-as3-datamanager/</guid>
		<description><![CDATA[A customer of mine found a bug my AS3&#160;DataManager when making multiple simultaneous calls.&#160; Here is the fix to the bug. The issue is that while the DataManager allows calls to many methods in a web service, each instance of &#8230; <a href="http://www.digitalprimates.net/author/tapper/2006/04/21/updates-to-the-as3-datamanager/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>A customer of mine found a bug my <a href="http://jeff.mxdj.com/as3_datamanager.htm">AS3&#160;DataManager </a>when making multiple simultaneous calls.&#160; Here is the fix to the bug. </p>
<p>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.&#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.&#160; The AsyncToken is carried along with the request and available when results happen as part of the ResultEvent.&#160; Even better, its a dynamic class, so you can add any arbitrary properties on it you want.&#160; So, to fix the issue, replace the existing makeRemoteCall method with this:</p>
<pre>public function makeRemoteCall(methodName:String,eventName:String, args:Object):void{<br />&#160;trace(&quot;DataManager.makeRemoteCall(&quot;+methodName+&quot;,&quot;+eventName+&quot;,&quot;+args+&quot;)&quot;);<br />&#160;this.eventName = eventName;<br />&#160;var op:mx.rpc.AbstractOperation = ws[methodName];<br />&#160;ws.addEventListener(&quot;result&quot;,doResults);<br />&#160;ws.addEventListener(&quot;fault&quot;,doFault);<br />&#160;<br />&#160;if(args){<br />&#160;&#160;op.arguments = args;<br />&#160;}<br />&#160;<br />&#160;var token:AsyncToken = op.send();<br />&#160;token.eventName = eventName;<br />}</pre>
<pre>private function doResults(event:ResultEvent):void{<br />&#160;var e:DataManagerResultEvent = new DataManagerResultEvent( event.token.eventName, event.result);<br />&#160;this.dispatchEvent(e);<br />}</pre>
<p>Now, the event names is stored with&#160;the request, so we have access to a different event name for each request&#160;made!&#160; The completed code looks like this:</p>
<pre><br />package managers {<br />&#160;&#160;import flash.events.EventDispatcher;<br />&#160;&#160;import mx.rpc.soap.WebService;<br />&#160;&#160;import mx.rpc.events.ResultEvent;<br />&#160;&#160;import mx.rpc.events.FaultEvent;<br />&#160;&#160;import mx.rpc.AbstractOperation;<br />&#160;&#160;import events.DataManagerResultEvent;<br />&#160;&#160;import flash.util.*<br />&#160;&#160;import mx.rpc.AsyncToken;;</pre>
<pre>&#160;&#160;/**&#160; DataManager - singleton class which enforces only<br />&#160;&#160;a single object is created for eachwsdl.&#160; To<br />&#160;&#160;access DataManager, use getDataManager(wsdl:String) */</pre>
<pre>&#160;&#160;public class DataManager extends EventDispatcher {<br />&#160;&#160;private var ws:WebService;<br />&#160;&#160;private var eventName:String;<br />&#160;&#160;// hashmap of instances for each wsdl&#160; <br />&#160;&#160;private static var instanceMap:Object = new Object();<br />&#160;&#160;private static var methodEventMap:Object = new Object();</pre>
<pre>&#160;&#160;public function DataManager(pri:PrivateClass, wsdl:String){<br />&#160;&#160;&#160;this.ws = new WebService();<br />&#160;&#160;&#160;ws.wsdl = wsdl;<br />&#160;&#160;&#160;ws.loadWSDL();<br />&#160;&#160;&#160;ws.useProxy = false;<br />&#160;&#160;}</pre>
<pre>&#160;&#160;public static function getDataManager(wsdl:String):DataManager{<br />&#160;&#160;&#160;if(DataManager.instanceMap[wsdl] == null){<br />&#160;&#160;&#160;&#160;DataManager.instanceMap[wsdl] = new DataManager(new PrivateClass(),wsdl);<br />&#160;&#160;&#160;}<br />&#160;&#160;&#160;<br />&#160;&#160;&#160;var dm:DataManager= DataManager.instanceMap[wsdl];<br />&#160;&#160;&#160;<br />&#160;&#160;&#160;if(dm.ws.canLoadWSDL()){<br />&#160;&#160;&#160;&#160;return dm;<br />&#160;&#160;&#160;} else {<br />&#160;&#160;&#160;&#160;throw new Error(&quot;BAD WSDL:&quot;+wsdl);<br />&#160;&#160;&#160;}<br />&#160;&#160;}<br />&#160;&#160;<br />&#160;&#160;public function makeRemoteCall(methodName:String,eventName:String, args:Object):void{<br />&#160;&#160;&#160;trace(&quot;DataManager.makeRemoteCall(&quot;+methodName+&quot;,&quot;+eventName+&quot;,&quot;+args+&quot;)&quot;);<br />&#160;&#160;&#160;this.eventName = eventName;<br />&#160;&#160;&#160;var op:mx.rpc.AbstractOperation = ws[methodName];<br />&#160;&#160;&#160;ws.addEventListener(&quot;result&quot;,doResults);<br />&#160;&#160;&#160;ws.addEventListener(&quot;fault&quot;,doFault);<br />&#160;&#160;&#160;<br />&#160;&#160;&#160;if(args){<br />&#160;&#160;&#160;&#160;op.arguments = args;<br />&#160;&#160;&#160;}<br />&#160;&#160;&#160;<br />&#160;&#160;&#160;var token:AsyncToken = op.send();<br />&#160;&#160;&#160;token.eventName = eventName;<br />&#160;&#160;}<br />&#160;&#160;<br />&#160;&#160;private function doResults(event:ResultEvent):void{<br />&#160;&#160;&#160;var e:DataManagerResultEvent = new DataManagerResultEvent( event.token.eventName, event.result);<br />&#160;&#160;&#160;this.dispatchEvent(e);<br />&#160;&#160;}<br />&#160;&#160;<br />&#160;&#160;private function doFault(fault:FaultEvent):void{<br />&#160;&#160;&#160;trace(&quot;DataManager.doFault(&quot;+fault.fault.faultString+&quot;)&quot;);<br />&#160;&#160;&#160;this.dispatchEvent(fault);<br />&#160;&#160;}<br />&#160;&#160;<br />&#160;&#160;public override function toString():String{<br />&#160;&#160;&#160;return &quot;DataManager&quot;;<br />&#160;&#160;}<br />&#160;}<br />}<br />&#160;/**&#160; PrivateClass is used to make&#160;&#160; DataManager constructor private */<br />class PrivateClass{<br />&#160;public function PrivateClass() {<br />&#160;}<br />}<br />&#160;</pre>]]></content:encoded>
			<wfw:commentRss>http://www.digitalprimates.net/author/tapper/2006/04/21/updates-to-the-as3-datamanager/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
