如何在actionscript中同步方法?

如何在actionscript中同步方法?,actionscript,synchronization,Actionscript,Synchronization,问题是我如何阻止一个方法被调用两次,例如,第一次调用没有“完成”,因为它的处理程序正在等待加载url 情况如下: 我已经编写了一个flash客户端,它使用二进制加密协议与java服务器进行接口(我希望不必重新发明整个客户端/服务器对象通信堆栈,但我必须以这样一种方式对数据进行加密,即使用SSL时,像篡改数据和charles proxy这样的简单工具无法获取数据) API以actionscript swf文件的形式呈现给flas,而API本身是一个单例 api公开了一些简单的方法,包括: 登录()

问题是我如何阻止一个方法被调用两次,例如,第一次调用没有“完成”,因为它的处理程序正在等待加载url

情况如下:

  • 我已经编写了一个flash客户端,它使用二进制加密协议与java服务器进行接口(我希望不必重新发明整个客户端/服务器对象通信堆栈,但我必须以这样一种方式对数据进行加密,即使用SSL时,像篡改数据和charles proxy这样的简单工具无法获取数据)
  • API以actionscript swf文件的形式呈现给flas,而API本身是一个单例
  • api公开了一些简单的方法,包括:
  • 登录()
  • getBalance()
  • startGame()
  • 终局
  • 每个方法都将调用我的HttpCommunicator类
  • HttpCommunicator.as(已删除错误处理和内容):

    问题是我无法保护同一个HttpCommunicator对象在第一个对象处理完完整事件之前被调用两次,除非:

  • 每次发送消息时,我都会创建一个新的HttpCommunicator对象。我还希望避免每次都创建URLLoader,但这不是我的代码,因此了解它的行为会有更大的问题)
  • 我可以在通讯上做一些类似同步的事情。这将有效地阻止,但这比中断数据传输要好。理论上讲,Flash客户端不应该连续两次调用同一个api函数,但我相信这会发生
  • 我实现了一个消息队列。然而,这也需要围绕push和pop方法进行同步,我找不到该怎么做
  • 将选择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
    }
    
    第二次调用是否会导致第一次调用communicator变量?i、 它的行为是否会像静态的一样,因为API对象只有一个副本


    如果说GUI上有一个按钮有“update balance”,并且用户一直在点击它,同时调用一个URLLoader complete event hander,它也调用API getBalance()函数(即flash是多线程的)。

    首先,除了网络API之外,flash不是多线程的。所有ActionScript都在同一个线程中运行

    您可以相当容易地创建一个类似信号量的系统,其中每个通信调用都传递一个“键”以及您已经指定的参数。该“键”只是一个字符串,表示您正在进行的调用类型(getBalance、login等)。“键”将是通用对象(对象或字典)中的属性,并将引用一个数组(如果它不存在,则必须创建它)

    如果数组为空,则调用将正常进行。如果没有,那么有关调用的信息将被放入一个对象中并推送到数组中。在完成一个调用之后,您的完整处理程序只需检查队列中是否有更多请求,如果有,则将其中一个请求出列并运行该请求

    这个系统的一点是,它仍然允许不同类型的请求并行发生——但每个请求都必须有一个新的URLLoader(只要在每个请求完成后清理它,这是完全合理的)

    // 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
    }