问题是如何阻止一个方法被调用两次,其中第一个调用没有“完成”,因为它的处理程序正在等待加载的url例如?
情况如下:
HttpCommunicator.as(错误处理和删除的东西):
public class HttpCommunicator {
private var _externalHalder:function;
public function communicate(data:String, externalHandler:APIHandler):void {
// do encryption
// add message numbers etc to data.
this._externalHalder = externalHandler;
request.data = encrypt(addMessageNumers(data)));
loader.addEventListener(Event.COMPLETE, handleComplete);
loader.load(request);
}
private function handleComplete(event:Event):void {
var loader:URLLoader = URLLoader(event.target);
String data = decrypt(loader.data);
// check message numbers match etc.
_externalHandler(data);
}
这个问题是我无法保护同一个HttpCommunicator对象在第一个处理完整事件之前被调用两次,除非:
选项1.是否有效?如果我有一个带有getBalance方法的单例,并且getBalance方法有:
// class is instantiated through a factory as a singleton
public class API{
var balanceCommunicator:HttpCommunicator = new HttpCommunicator(); // create one for all future calls.
public funciton getBalance(playerId:uint, hander:Fuction):Number {
balanceCommunicator.communicate(...); // this doesnt block
// do other stuff
}
第二次呼叫是否会首先调用通信器变量?即它的行为就像它的静态一样,因为只有API对象的一个副本?
如果说GUI上有一个具有“更新余额”的按钮,并且用户一直点击它,同时说一个URLLoader完成事件处理程序被调用,它也会调用apis getBalance()函数(即flash是多线程的。)
答案 0 :(得分:1)
嗯,首先,除了网络API之外,Flash不是多线程的。所有ActionScript都在同一个线程中运行。
您可以相当轻松地创建一个类似信号量的系统,其中每个通信调用都以“键”以及您已指定的参数传递。那个“键”只是一个表示你正在做的调用类型的字符串(getBalance,login等)。 “key”将是泛型对象(Object或Dictionary)中的属性,并且将引用一个数组(如果它不存在则必须创建它)。
如果数组为空,则调用将正常进行。如果没有,那么有关该调用的信息将被放入一个对象并被推入该数组。完成一个调用之后,你的完整处理程序必须只检查队列中是否有更多请求,如果是,则将其中一个请求出列并运行该请求。
关于这个系统的一件事是它仍然允许不同类型的请求并行发生 - 但是你必须为每个请求设置一个新的URLLoader(只要你在每次请求后清理它就完全合理已经完成了。