我在Adobe 4 (ActionScript 3)中有一个函数,接受一个对象并返回一个ArrayCollection.
如果某个全局变量设置为true,我希望函数在运行前延迟3秒。否则,我希望该函数能够正常运行。
问题是,如果我使用计时器,计时器调用一个单独的函数,该函数不能将任何东西返回给我的调用函数,它调用的函数也不能接受任何参数,所以在TimerComplete事件触发后,我不可能递归地调用自己的函数.递归调用无论如何都不能工作,因为它将把ArrayCollection返回给计时器结果函数,而不是原始调用函数.
我需要函数内部的延迟,而不是导致我超出该功能的延迟。但我不知道该怎么做。
像这样的事情是我需要做的
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);
}
所以..。对于如何在不调用不能将对象返回到原始函数的外部计时器函数的情况下完成这一任务,有什么想法吗?
谢谢,
发布于 2017-08-26 07:07:29
正常(同步)代码流在准备好值后才会返回,因此如果您希望在不允许应用程序进行任何操作的情况下实际等待3秒,请使用@Organis的答案中的getTimer()
方法。如果要获得异步结果,则需要面对并克服更多的问题。
首先,您期望返回的ArrayCollection
何时实际到达。谈到代码设计,异步代码需要大量的假设、线程安全等,即使AS3/Flash没有真正的多线程,除非计算Worker
,但事件的代码流并不明显。因此,无论是谁调用您的createArrayCollection()
,都不能期望它立即返回值。因此,说到您的直接问题,不,如果您想要一个响应性的应用程序,您就不能避免某种类型的定时器。但是,您可以通过一种间接返回结果的方法来使用它们。
第二,如果您的应用程序需要更多的数组集合,那么是否有可能请求更多的数组集合--您必须准备好应对由此可能造成的任何类型的干扰。假设您的函数是由按钮单击触发的--如果该按钮在3秒内被单击不止一次,该怎么办?
第三,处理代码的实际路由不是异步返回的直接路由。您需要回调、事件处理程序(本质上是半本地回调)、定期检查值是否存在的代码(输入框架处理程序等),或者类似的技巧来收集异步返回的值,然后将其传输到任何将进一步处理它的相关代码中。因此,您需要设计一个能够接收复杂数据(源对象前向、数组收集向后)的接口,然后根据所有可能的情况和缺陷仔细测试它。
这是实现所有这些的一个很长的例子,我将尝试以某种方式概述它。Ler假设您有一个"server“类,它接受数据请求,并同步(不等待)或异步(等待)处理数据。它接受一个类型为"T“的源对象,并提供一个新创建的ArrayCollection
类型的对象,该对象作为参数提供给发送给它的回调函数。它还接受延迟(显示同步/异步返回的一种简单方法是布尔值,但为什么不获取int呢?)作为参数,并保证(在事件模型限制的范围内),在此延迟之后,回调将被称为ASAP。然后,该体系结构将如下所示:
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
中调用setTimeout
从request
事件处理程序中调用回调,最初来自request
的数据存储在requests
中。
https://stackoverflow.com/questions/45889990
复制相似问题