AS3:如何分解函数以避免 15 秒超时规则?
AS3: How do I break up a function to avoid the 15 second time out rule?
我有一个功能可以工作,但是如果我增加记录数,就会出现十五秒超时错误。我已经看到 "batchifying" 一个函数的典故,将它分成块,以欺骗处理器重新开始 15 秒,但似乎无法让它工作。
代码:
startBatch=0;
private function findDupes():void {
var el:Number; //elapsed time variable
timeoutTime = getTimer();
for (var i:int = startBatch; i < numTix; i++) { // numTix = total number of records
for (var j:int = i + 1; j < numTix; j++) {
if (individualTicket[i] == individualTicket[j]) {
// mark duplicate
}
}
el = getTimer() - timeoutTime;
if (el > 1000) {
trace("batched out");
batchOut(i);
return;
}
}
weAreDone();
}
private function batchOut(i:int):void {
updateTB2(i); //attempts to update a textbox and FAILS to do so
trace("Out at # ", i);
if (i < numTix) {
startBatch = i;
findDupes();
}
else {
weAreDone();
}
}
因此,它每秒 "batches out" 并以新编号 (startBatch) 重新启动 findDupes() 函数。我曾希望这会重置超时错误,但我却一头雾水。
任何人都可以指出正确的方向吗?
尝试在一两个工人身上做 "heavy lifting"。工人是非阻塞的,应该可以解决您的问题。以下是关于它们的更多信息:http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/system/Worker.html
您需要修改 batchOut
函数。目前,它不允许 Flash 引擎更新屏幕上的任何内容,因为它会立即调用 findDupes
的另一次迭代,而应该 return 并在下一帧出现时为另一次迭代设置 class开始。我在这里假设此代码中有一个可用的 stage
变量。为了进行这种批处理,您需要允许监听 Event.ENTER_FRAME
的东西,stage
是显示对象的通用锚点。
private function batchOut(i:int):void {
updateTB2(i); //attempts to update a textbox and FAILS to do so
trace("Out at # ", i);
if (i < numTix) {
startBatch = i+1; // your findDupes pass the already processed value of outer index
// findDupes(); this is a recursion call, drop
if (!(stage.hasEventListener(Event.ENTER_FRAME,continueBatch)) {
stage.addEventListener(Event.ENTER_FRAME,continueBatch);
}
}
else {
weAreDone();
if (stage.hasEventListener(Event.ENTER_FRAME,continueBatch)) {
stage.removeEventListener(Event.ENTER_FRAME,continueBatch);
}
}
}
// now the function to be called
private function continueBatch(e:Event):void {
// this is called in the NEXT frame, so you can freely call your worker function
findDupes();
}
我有一个功能可以工作,但是如果我增加记录数,就会出现十五秒超时错误。我已经看到 "batchifying" 一个函数的典故,将它分成块,以欺骗处理器重新开始 15 秒,但似乎无法让它工作。 代码:
startBatch=0;
private function findDupes():void {
var el:Number; //elapsed time variable
timeoutTime = getTimer();
for (var i:int = startBatch; i < numTix; i++) { // numTix = total number of records
for (var j:int = i + 1; j < numTix; j++) {
if (individualTicket[i] == individualTicket[j]) {
// mark duplicate
}
}
el = getTimer() - timeoutTime;
if (el > 1000) {
trace("batched out");
batchOut(i);
return;
}
}
weAreDone();
}
private function batchOut(i:int):void {
updateTB2(i); //attempts to update a textbox and FAILS to do so
trace("Out at # ", i);
if (i < numTix) {
startBatch = i;
findDupes();
}
else {
weAreDone();
}
}
因此,它每秒 "batches out" 并以新编号 (startBatch) 重新启动 findDupes() 函数。我曾希望这会重置超时错误,但我却一头雾水。
任何人都可以指出正确的方向吗?
尝试在一两个工人身上做 "heavy lifting"。工人是非阻塞的,应该可以解决您的问题。以下是关于它们的更多信息:http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/system/Worker.html
您需要修改 batchOut
函数。目前,它不允许 Flash 引擎更新屏幕上的任何内容,因为它会立即调用 findDupes
的另一次迭代,而应该 return 并在下一帧出现时为另一次迭代设置 class开始。我在这里假设此代码中有一个可用的 stage
变量。为了进行这种批处理,您需要允许监听 Event.ENTER_FRAME
的东西,stage
是显示对象的通用锚点。
private function batchOut(i:int):void {
updateTB2(i); //attempts to update a textbox and FAILS to do so
trace("Out at # ", i);
if (i < numTix) {
startBatch = i+1; // your findDupes pass the already processed value of outer index
// findDupes(); this is a recursion call, drop
if (!(stage.hasEventListener(Event.ENTER_FRAME,continueBatch)) {
stage.addEventListener(Event.ENTER_FRAME,continueBatch);
}
}
else {
weAreDone();
if (stage.hasEventListener(Event.ENTER_FRAME,continueBatch)) {
stage.removeEventListener(Event.ENTER_FRAME,continueBatch);
}
}
}
// now the function to be called
private function continueBatch(e:Event):void {
// this is called in the NEXT frame, so you can freely call your worker function
findDupes();
}