как убить функцию setTimeout () - PullRequest
4 голосов
/ 04 февраля 2010

Я использую функцию setTimeout () через мое приложение, но когда пора собирать мусор. метод все еще работает и вызывает функцию. Как мне остановить его от вызова определенной функции. Я попытался установить его на ноль, но он не работает

Ответы [ 5 ]

16 голосов
/ 04 февраля 2010

setTimeout возвращает ссылку на тайм-аут, который вы можете использовать при вызове clearTimeout .

var myTimeout = setTimeout(...);
clearTimeout(myTimeout);
2 голосов
/ 04 февраля 2010

См .: clearTimeout()

0 голосов
/ 06 ноября 2012

У меня была похожая ситуация, и это сводило меня с ума на пару часов. Ответы, которые я нашел в сети, тоже не помогли, но в конце концов я обнаружил, что вызов System.gc() помогает.

Я использую слушатель слабой ссылки ENTER_FRAME, чтобы проверить, удаляется ли экземпляр GC. Если GC очищает объект, ENTER_FRAME должен прекратить работу.

Вот пример:

package {

import flash.display.Sprite;
import flash.events.Event;
import flash.system.System;
import flash.utils.getTimer;
import flash.utils.setTimeout;

public class GCTest {
    private var _sprite:Sprite;

    public function GCTest():void {
        this._sprite = new Sprite();
        this._sprite.addEventListener(Event.ENTER_FRAME, this.test, false, 0, true);
        setTimeout(this.destroy, 1000); //TEST  doesn't work
    }

    private function test(event:Event):void {
        trace("_" + getTimer());    //still in mem
    }

    public function destroy():void {
        trace("DESTROY")
        System.gc();
    }

}}

Когда вы комментируете System.gc();, тестовый метод продолжает вызываться даже после вызова метода destroy (поэтому время ожидания истекло). Вероятно, это потому, что памяти все еще достаточно, поэтому GC сам по себе не срабатывает. Когда вы закомментируете setTimeout, тестовый метод вообще не будет вызываться, то есть определенно проблема в setTimeout.

Вызов System.gc(); остановит отправку ENTER_FRAME.

Я также провел несколько тестов с clearTimeout, setInterval и clearInterval, но это не повлияло на GC.

Надеюсь, это поможет некоторым из вас с такими же или похожими проблемами.

0 голосов
/ 04 февраля 2010

То же самое. Используйте "clearInterval (timeoutInstance)".

Если вы используете AS3, я бы использовал класс Timer ()

import flash.utils.*;
var myTimer:Timer = new Timer(500);
myTimer.addEventListener("timer", timedFunction);

// Start the timer
myTimer.start();

function timedFunction(e:TimerEvent)
{
  //Stop timer
  e.target.stop();
}
0 голосов
/ 04 февраля 2010

Неважно, clearInterval ()!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...