Вообще-то существует замечательная функция-сестра интервальной - setTimeout, крепко отчего-то всеми игнорируемая, и для которой нет необходимости отключать выполнение явно, так как заданная на исполнение функция выполнится только один раз.
Короче, она
идеально подходит для разового отсроченного исполнения:

Код AS1/AS2:
var wait:Number = setTimeout (someFunction, 10000, 'ok!');
function someFunction (mess:String) {
trace (mess); //выведет 'ok!' через 10 сек.
}
Как видите, можно также передавать параметры исполняемой функции..
Видимо setTimeout - это та же setInterval c автоматической самоочисткой после первого же выполнения целевой функции.
PS. Во, даже парсер AS-кода на форуме с нею не знаком - не подсветил синим... беда прямо..
Теперь
по вашей ошибке - возможная и распространенная причина в том, что у вас интенсивно стартовался каждый раз новый интервал, а не один и тот же при сработке триггера! То есть функция не успевала очищать все вновь и вновь стартуемые интервалы.
В этом можно убедится, если сделать trace по его имени - каждый раз номер будет на единицу большим.
Нужно их было делать именными и очищать каждый индивидуально (это не один и тот же интервал), в этом была проблема. Вот смоделирован пример для иллюстрации, в нем стартуется 10 раз вызов целевой функции с трейсом сообщения, делается через интервал.

Код AS1/AS2:
var intHolder:Object = new Object();
var i:Number = 0;
this.onEnterFrame = function () {
if (i < 10) {
//задаем переменную типа тumber, как содержимое i-го элемента объекта intHolder, и приравниваем ей очередной интервал:
intHolder[i] = setInterval (someFunction, 10000, i, 'ok ' + i);
//переменную i передаем в целевую ф-ю, как параметр, чтобы та знала, какой именно экземпляр интервала потом очищать
i++;
}
else {
delete this.onEnterFrame ;
}
}
function someFunction (num:Number, mess:String) {
trace (mess); //выведет 'ok' и номер через 10 сек. несколько раз
clearInterval (intHolder[num]);
}
Но все равно лучше делать через setTimeout в вашем случае, чтобы не ухищряться с очисткой.