【问题标题】:Can I guarantee all listeners have executed on the next line after dispatching an event?调度事件后,我可以保证所有侦听器都在下一行执行吗?
【发布时间】:2009-12-16 00:18:39
【问题描述】:

关于这个主题的堆栈溢出有几个问题,但我仍然不清楚:

我知道 Flash 引擎是单线程的,所以当它接收到一个事件时,它是否会中断,执行任何已注册的事件侦听器(没有保证的顺序)然后返回到当前范围?

如果我有这个代码:

addListener("stuff", function():void {
     // some stuff
});
addListener("stuff", someFunc);
dispatch(new Event("stuff"));
trace("Done.");

我想知道:

我能否保证在我到达 trace("Done"); 行时两个侦听器都已执行?

编辑:

我能否保证当前函数将在任何事件侦听器执行之前完成?即 trace("Done"); 将始终先执行。

都没有。

【问题讨论】:

    标签: apache-flex actionscript-3 event-handling


    【解决方案1】:

    由于用户代码生成的事件是同步的,因此可以保证在跟踪之前调用两个事件处理程序:
    Does dispatching an event interrupt a function?

    【讨论】:

      【解决方案2】:

      据我所知,当您分派一个事件时,它会被添加到事件队列中,但在当前执行的事件完成之前不会真正运行。换句话说,您将跟踪“完成”,然后您的函数结束,控制权传回事件处理程序,然后它(可能)才开始执行您的事件之一。

      【讨论】:

      • 这就是我最初认为它的工作方式。检查我更新的问题。
      • 显然你的模型只适用于外部事件。由于我的函数本身正在调度事件,因此侦听器总是会立即执行。 “如果触发了某些外部事件......那么我不相信在当前例程完成之前会处理该事件。如果 foo() 本身触发一个事件,那么流程将完全按照您的描述进行 - 该事件会立即处理单个(主)线程。" - stackoverflow.com/questions/1267685/…
      【解决方案3】:

      是的,您可以在这种确切情况下保证两个断言。 这意味着,如果添加您的事件侦听器并调度您的事件是在相同的代码块中,它将按顺序发生。然而,从一个完全没用的实际 POV 来看。

      @kryoko:玩家事件优先于用户事件,但它们不会“强制”自己通过。这意味着如果用户代码正在运行,则播放器事件处理将暂停。这就是为什么可以用繁重、密集的代码“冻结”一部 Flash 电影的原因。 (当然也可以使用简单的无限循环)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-29
        • 1970-01-01
        • 1970-01-01
        • 2013-09-21
        • 1970-01-01
        • 2014-09-06
        相关资源
        最近更新 更多