Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 如何在PureMVC flex应用程序中执行重复操作?_Actionscript 3_Apache Flex_Air_Puremvc - Fatal编程技术网

Actionscript 3 如何在PureMVC flex应用程序中执行重复操作?

Actionscript 3 如何在PureMVC flex应用程序中执行重复操作?,actionscript-3,apache-flex,air,puremvc,Actionscript 3,Apache Flex,Air,Puremvc,目前正在从事基于PureMVC框架的flex-AIR项目。这个项目有一个新的需求,一个操作要定期重复执行,这有一些业务逻辑。根据PureMVC,这应该放在命令中,但是命令执行时会被垃圾回收 鉴于这种情况,几乎没有疑问/困惑/澄清 使用业务逻辑创建命令将是一个解决方案。。。但是,谁会在特定的时间间隔触发它呢?(这不应该按照PureMVC通过命令完成吗) 将命令触发器放在中介器中或将逻辑放在中介器中(这会使pureMVC有点不纯:) 如何为这种情况找到解决方案?试试以下方法: 创建一个单例类- 在

目前正在从事基于PureMVC框架的flex-AIR项目。这个项目有一个新的需求,一个操作要定期重复执行,这有一些业务逻辑。根据PureMVC,这应该放在命令中,但是命令执行时会被垃圾回收

鉴于这种情况,几乎没有疑问/困惑/澄清

  • 使用业务逻辑创建命令将是一个解决方案。。。但是,谁会在特定的时间间隔触发它呢?(这不应该按照PureMVC通过命令完成吗)
  • 将命令触发器放在中介器中或将逻辑放在中介器中(这会使pureMVC有点不纯:)
  • 如何为这种情况找到解决方案?

    试试以下方法:

    • 创建一个单例类-
    • 在这个类中有一个函数(如start),当被调用时,它会启动一个计时器,该计时器的回调函数会发送一个通知,该通知会触发执行业务逻辑的命令
    • 当您准备好开始常规操作时,只需在单例上调用get instance方法,创建单例,然后调用它的start()函数。 *(可选)具有停止功能,可取消计时器并停止发送的常规通知

      package
      {
       import flash.events.TimerEvent;
       import flash.utils.Timer;
      
      
       public final class RepititiveSingleton
       {
          private var timer:Timer;
      
          private static var instance:RepititiveSingleton= new RepititiveSingleton();
      
          public function RepititiveSingleton() {
              if( RepititiveSingleton.instance ) {
                  throw new Error( 
                      "ReptitiveSingleton can only be accessed through Singleton.getInstance()" ); 
              }
          }
      
          public static function getInstance():RepititiveSingleton{                        
              return RepititiveSingleton.instance;
          }
      
          public function start(interval:Number = 1000):void {
              timer = new Timer(interval);
              timer.addEventListener(TimerEvent.TIMER, onTimer);
          }
      
          private function onTimer(e:TimerEvent):void {
                       ApplicationFacade.getInstance().sendNotification(Constants.REPTITIVE_ACTION_NOTIFICATION));
          }
      
       }
      }
      
    此代码假定您的具体外观名为ApplicationFacade,并使用从名为constants的类引用的字符串常量注册了通知

    然后在适当的位置(可能在启动命令中)可以添加:

    RepetitiveSingleton.getInstance().start();
    

    希望这对您有所帮助。

    取决于
    命令应该做什么-如果它更新
    模型
    请在您的
    代理
    类中放置一个
    计时器
    ,并每隔xx秒发送一个
    通知
    ,该通知映射到一个
    命令
    ,该命令可以执行您希望它执行的任何操作

    如果它只需要更新
    视图
    ,则可以将
    计时器
    添加到相应的
    中介
    ,但这样就根本不需要
    命令

    **

    不要创建比您需要的更多的单例
    ApplicationFacade
    已经是一次尝试,并保持这种方式

    **


    如果您必须对后端执行任何异步调用,只需确保添加
    EventListener
    ,而不将
    weakReference
    设置为true-然后一切都应该正常…

    您需要分离要运行的异步进程和重复触发所述进程。我的建议是为异步进程创建一个代理和一个单独的代理,该代理是计时器的包装器,它只是在超时时发送通知。通知耦合到一个命令,该命令反过来调用异步代理的方法。通过这种方式,您可以向命令添加逻辑,例如,如果进程仍然繁忙,应该做什么


    创建两个代理的好处是:遵守SRP。您可以轻松地交换/修改/删除不接触异步代理的定时代理。一切都很好地分开了。

    在我看来,计时器属于中介。让它来调解异步进程消息传递。它将是一个小型的状态机,以确保一切顺利运行。命令仍然起着重要作用,它就像911操作员一样坐在那里。

    AFAIK命令用于业务逻辑。我想你是指别的什么?为什么geta垃圾回收命令很重要?它需要存储状态吗?这就是模型的用途。还是需要控制顺序异步进程?或者我们可能正在使用不同的业务逻辑定义。因为这是关于PureMVC的,所以我使用PureMVC最佳实践中的定义:您是正确的,命令用于业务逻辑。我有一个顺序异步进程要在后台运行。我不认为在我的情况下添加另一个单例是合适的解决方案。到目前为止,我已经将计时器添加到中介器中,并发送通知以调用该命令。我不认为这是正确的解决方案,但我必须处理好这个问题。向代理添加计时器是一个很好的解决方法。谢谢如果这个答案对你有帮助,请认为它是正确的。谢谢