PDA

Просмотр полной версии : почему не работает setInterval в цикле?


soldatoff
01.02.2009, 23:41
Помогите пожалуйста разобраться с задержкой показа.

Делаю текстовый баннер.

У меня есть файл vars.htm, его содержимое:

myVar01=первый текстRRвторой текст RRну и конечно третий&myVar02=RR&myVar03=3000

Из него забираются данные во флешку:

var data_lv:LoadVars = new LoadVars ();
data_lv.onLoad = function (success) {
if(success) {
var texts:Array = this.myVar01.split(this.myVar02);
var len:Number = texts.length;
for (var i:Number = 0; i < len; i++) {
setInterval((_root.klip.text = texts[i].toString()), this.myVar03);
}
}
}
data_lv.load("vars.htm");

во самой флешке есть только одно текстовое поле с именем klip, по идее - при проходе по массиву texts, при каждой передаче в _root.klip.text, должна происходить задержка в 3 сек. Но в итоге флешка мне показывает только последнее значение из переменной myVar01 ("ну и конечно третий").

Пробовал делать еще так:

var data_lv:LoadVars = new LoadVars ();
data_lv.onLoad = function (success) {
if(success) {
var texts:Array = this.myVar01.split(this.myVar02);
var len:Number = texts.length;
for (var i:Number = 0; i < len; i++) {

setInterval(function(klip, texts, i){_root.klip.text = texts[i].toString()}, this.myVar03);
}
}
}
data_lv.load("vars.htm");

тут вообще пишет undefined.

Я не бог весть какой спец в actionscript, но стараюсь хотябы научиться простым вещам.

Подскажите, плиз, что я делаю не так?

chingachgoog
01.02.2009, 23:48
Посмотрите на синтаксис setInterval - он трех видов.
Особенности:
1) Не надо писать оператор вызова функции ()
2) Ссылка this правильно работать не будет - воспользуйтесь третим видом синтаксиса или другой ссылкой.

dimarik
02.02.2009, 01:41
chingachgoog, подскажите, как выглядит третий вид setInterval

chingachgoog
02.02.2009, 11:56
chingachgoog, подскажите, как выглядит третий вид setInterval


Третий - когда вначале указывается путь objectReference.
Но я так понимаю вас смутило, то что их три, а не два?
Это потому, что по сути первый синтаксис представлен двумя видами:
ссылкой на функцию и возможностью задать литерал непосредственно.

iNils
02.02.2009, 14:00
ссылкой на функцию и возможностью задать литерал непосредственно.Не котируется. Синтаксиса два.

chingachgoog
02.02.2009, 14:58
Не котируется. Синтаксиса два.


Хорошо. Если код

setInterval(моя_функция, 100)

function моя_функция(){
trace("!")
}


и код

setInterval(function(){
trace("!")
}, 100)

"котируются" как один и тот же синтаксис - то я не спорю.
Но замечу, что разница между этими двумя записями есть.
А есть еще один вариант записи - т.н. "второй синтаксис".
Итого я вижу три различных варианта записи setInterval.

DarkLight
02.02.2009, 15:22
chingachgoog, для Вас
trace("aa");
и
var s:String = "aa";
trace(s);
2 разных синтаксиса?

chingachgoog
02.02.2009, 15:36
DarkLight, вы правы - я различаю эти два варианта записи.

iNils
02.02.2009, 16:02
Для того, кого скоро забанят. Вот это синтаксис:
setInterval(functionReference:Function, interval:Number, [param1:Object, param2, ..., paramN]) : Number
setInterval(objectReference:Object, methodName:String, interval:Number, [param1:Object, param2, ..., paramN]) : Number
В приведенном выше примере, в обоих случаях для первого синтаксиса первым аргументом является Function, в не зависимости от того в каком виде оно туда попало.

ALiEN_
02.02.2009, 16:39
2 chingachgoog

Синтаксис и способы написания, это разные вещи. Можно придумать 100 способов передачи параметров в функцию например, но то что в нее нужно передать лишь определенное количество параметров определенного типа, это и есть синтаксис.


trace ( "aa" );


и

var s:String = "aa";
trace ( s );


В обоих случаях синтаксис записи "trace" верен, синтаксических ошибок нет. В обоих случаях отдается String, в качестве параметра, значит оба примера синтаксически одинаковы. Сама запись кода, конечно разная, но не путайте одно с другим.

chingachgoog
02.02.2009, 16:41
iNils, я же не спорю со святым хелпом (http://flasher.ru/forum/showthread.php?p=791224#post791224) от адоба.
Но скажи: ты видишь разницу между

trace("aa");

и

s = "aa";
trace(s);

?
В этом примере от DarkLight разница даже больше, чем в моем примере с литералом в интервале. У меня хоть можно извернуться и добраться-таки потом до анонимной функции, если потребуется. А в случае с trace("aa") - все - уже никак не добраться.

add
ALiEN_, если вы о слове "синтаксис", то как я уже сказал, с этой терминологией я не спорю.

iNils
02.02.2009, 17:04
Мне по барабану, что там в трейсе. Речь шла о синтаксисе. Если ты признаешь, что синтаксиса два, то вопрос закрыт.

soldatoff
07.02.2009, 16:43
Народ, спасибо за советы
я кое что сделал, но теперь у меня другая проблема

var data_lv:LoadVars = new LoadVars ();
data_lv.load("vars.htm");

data_lv.onLoad = function() {
var texts:Array = this.myVar01.split(this.myVar02);
var delay:Number = this.myVar03*1000;
var count:Number = 0;
var timerID = setInterval(createTxt,delay,this);

function createTxt(){
trace("texts[" + count.toString() + "] = " + texts[count].toString()); //данные

createTextField(texts[count],count,0,0,200,16);
var w = eval(texts[count]);
w.text = texts[count];
w.background = "#FFF;"
count++;
trace(count); //count
if(count >= texts.length){
// clearInterval(timerID);
count = 0;
}
}
}

trace показывает, что переменная count обнуляется по условию if(count >= texts.length), также trace показывает, что проход по массиву начинается сначала, но в самой флешке происходит проход только один раз.. т.е. первый текст -> второй -> третий.. и всё. А в output'е trace показывает, что проход продолжается.
Короче мне надо чтобы проход по массиву отображался визуально, т.е. чтобы баннер работал.

Где я в коде накосячил, не подскажите? Пожалуйста..

chingachgoog
07.02.2009, 22:17
Не пойму в чем проблема? clearInterval не срабатывает?
Попробуйте написать

var timerID = setInterval(createTxt,delay,this);


без var

timerID = setInterval(createTxt,delay,this);


или так:

var timerID = setInterval(createTxt,delay,this);
....
clearInterval(this.timerID); // не уверен, что сработает


или так

createTxt.timerID = setInterval(createTxt,delay,this);
...
clearInterval(createTxt.timerID);

soldatoff
07.02.2009, 22:41
2 chingachgoog:

на самом деле, я зря оставил эти строчки :)

код выглядит так:
var data_lv:LoadVars = new LoadVars ();
data_lv.load("vars.htm");

data_lv.onLoad = function() {
var texts:Array = this.myVar01.split(this.myVar02);
var delay:Number = this.myVar03*1000;
var count:Number = 0;
setInterval(createTxt,delay,this);

function createTxt(){
trace("texts[" + count.toString() + "] = " + texts[count].toString()); //данные

createTextField(texts[count],count,0,0,550,100);
var w = eval(texts[count]);
w.text = texts[count];
w.background = "#FFF;"
count++;
trace(count); //count
if(count >= texts.length){
count = 0;
}
}
}

А проблема в том, что когда я нажимаю Ctrl+Enter, компилируется флешка и показывает только один проход по массиву с фразами (с указанной задержкой между фразами), а в окне Output, трейс показывает что проход продолжается, что мне собственно и надо!

Т.е. мне надо, чтобы флешка бесконечно показывала по-очереди фразы из массива texts, а она один раз как бы отрабатывает и все.. попробуйте проверить этот код во флеше?

Я не знаю какими словами объяснить :( ну не специалист я пока еще во флеше!... Помогите пожалуйста разобраться!