首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在ActionScript 3函数中创建延迟

在ActionScript 3函数中创建延迟
EN

Stack Overflow用户
提问于 2017-08-25 22:08:59
回答 3查看 2K关注 0票数 1

我在Adobe 4 (ActionScript 3)中有一个函数,接受一个对象并返回一个ArrayCollection.

如果某个全局变量设置为true,我希望函数在运行前延迟3秒。否则,我希望该函数能够正常运行。

问题是,如果我使用计时器,计时器调用一个单独的函数,该函数不能将任何东西返回给我的调用函数,它调用的函数也不能接受任何参数,所以在TimerComplete事件触发后,我不可能递归地调用自己的函数.递归调用无论如何都不能工作,因为它将把ArrayCollection返回给计时器结果函数,而不是原始调用函数.

我需要函数内部的延迟,而不是导致我超出该功能的延迟。但我不知道该怎么做。

像这样的事情是我需要做的

代码语言:javascript
运行
复制
private function createArrayCollection(myObject:Object):ArrayCollection {

    var myArrayCollection:ArrayCollection = new ArrayCollection();

    if (globalWaitBoolean) {
        //delay here for 3 seconds, somehow
    }

    //Here I do the stuff that uses the info in myObject to figure out what to
    //put into the ArrayCollection I want to return

    return (myArrayCollection);
}

所以..。对于如何在不调用不能将对象返回到原始函数的外部计时器函数的情况下完成这一任务,有什么想法吗?

谢谢,

EN

Stack Overflow用户

发布于 2017-08-26 07:07:29

正常(同步)代码流在准备好值后才会返回,因此如果您希望在不允许应用程序进行任何操作的情况下实际等待3秒,请使用@Organis的答案中的getTimer()方法。如果要获得异步结果,则需要面对并克服更多的问题。

首先,您期望返回的ArrayCollection何时实际到达。谈到代码设计,异步代码需要大量的假设、线程安全等,即使AS3/Flash没有真正的多线程,除非计算Worker,但事件的代码流并不明显。因此,无论是谁调用您的createArrayCollection(),都不能期望它立即返回值。因此,说到您的直接问题,不,如果您想要一个响应性的应用程序,您就不能避免某种类型的定时器。但是,您可以通过一种间接返回结果的方法来使用它们。

第二,如果您的应用程序需要更多的数组集合,那么是否有可能请求更多的数组集合--您必须准备好应对由此可能造成的任何类型的干扰。假设您的函数是由按钮单击触发的--如果该按钮在3秒内被单击不止一次,该怎么办?

第三,处理代码的实际路由不是异步返回的直接路由。您需要回调、事件处理程序(本质上是半本地回调)、定期检查值是否存在的代码(输入框架处理程序等),或者类似的技巧来收集异步返回的值,然后将其传输到任何将进一步处理它的相关代码中。因此,您需要设计一个能够接收复杂数据(源对象前向、数组收集向后)的接口,然后根据所有可能的情况和缺陷仔细测试它。

这是实现所有这些的一个很长的例子,我将尝试以某种方式概述它。Ler假设您有一个"server“类,它接受数据请求,并同步(不等待)或异步(等待)处理数据。它接受一个类型为"T“的源对象,并提供一个新创建的ArrayCollection类型的对象,该对象作为参数提供给发送给它的回调函数。它还接受延迟(显示同步/异步返回的一种简单方法是布尔值,但为什么不获取int呢?)作为参数,并保证(在事件模型限制的范围内),在此延迟之后,回调将被称为ASAP。然后,该体系结构将如下所示:

代码语言:javascript
运行
复制
class Processor {
    Dictionary requests; // here all the requests that are delayed will be stored
    public function dpr(source:T,callback:Function,delay:int=0):void{...}
    // creates requests and stores them
    private function syncProcess(source:T):ArrayCollection {...}
    // whatever routine you want to get variably delayed
    private function processTimeout(e:Event=null):void {...}
    // processes events from "setTimeout()" and calls callbacks
}

请注意,异步方法比同步方法更需要创建三个实体。第一个是请求保持结构(这里的字典),第二个是超时事件处理程序,第三个是当数据准备好时您想要得到的任何回调。代码流将如下所示:

同步调用将导致从类内直接调用的回调:request->processTimeout->syncProcess()->callback.异步调用将通过在Timer::timerComplete中调用setTimeoutrequest事件处理程序中调用回调,最初来自request的数据存储在requests中。

票数 1
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45889990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档