Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   почему не работает setInterval в цикле? (http://www.flasher.ru/forum/showthread.php?t=120854)

soldatoff 01.02.2009 23:41

почему не работает setInterval в цикле?
 
Помогите пожалуйста разобраться с задержкой показа.

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

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

myVar01=первый текстRRвторой текст RRну и конечно третий&myVar02=RR&myVar03=3000
Из него забираются данные во флешку:
Код AS1/AS2:

var data_lv:LoadVars = new LoadVars ();
data_lv.onLoadfunction (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 ("ну и конечно третий").

Пробовал делать еще так:
Код AS1/AS2:

var data_lv:LoadVars = new LoadVars ();
data_lv.onLoadfunction (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

Цитата:

Сообщение от dimarik (Сообщение 794943)
chingachgoog, подскажите, как выглядит третий вид setInterval

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

iNils 02.02.2009 14:00

Цитата:

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

chingachgoog 02.02.2009 14:58

Цитата:

Сообщение от iNils (Сообщение 795006)
Не котируется. Синтаксиса два.

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

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

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

и код
Код:

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

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

DarkLight 02.02.2009 15:22

chingachgoog, для Вас
Код AS1/AS2:

trace("aa");

и
Код AS1/AS2:

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, я же не спорю со святым хелпом от адоба.
Но скажи: ты видишь разницу между
Код:

trace("aa");
и
Код:

s = "aa";
trace(s);

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

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

iNils 02.02.2009 17:04

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

soldatoff 07.02.2009 16:43

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

Код AS3:

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:

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

код выглядит так:
Код AS1/AS2:

var data_lv:LoadVars = new LoadVars ();
data_lv.load("vars.htm");
 
data_lv.onLoadfunction() {
        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, а она один раз как бы отрабатывает и все.. попробуйте проверить этот код во флеше?

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


Часовой пояс GMT +4, время: 23:43.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.