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();
}