Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Почему не работает setTimeout? (https://javascript.ru/forum/events/64149-pochemu-ne-rabotaet-settimeout.html)

butch16 22.07.2016 11:09

Почему не работает setTimeout?
 
Здравствуйте! Мне уже помогли на этом форуме, попробую еще раз.))) Я дизайнер, а не программист и в javascript полный чайник.

Проблема такая:

Есть простейший баннер сделанный для примера Adobe Animate: круг движется по прямой до границ баннера и обратно. Хочу его остановить через заданное время. Если использую просто stop(), то проигрывание останавливается в любом кадре, а если использую setTimeout, то ничего не происходит, причем Alert прекрасно срабатывает... в чем проблема?

Код:

(function (lib, img, cjs, ss) {

var p; // shortcut to reference prototypes

// library properties:
lib.properties = {
	width: 240,
	height: 400,
	fps: 24,
	color: "#FFFFFF",
	manifest: []
};

// symbols:

(lib.Символ1 = function(mode,startPosition,loop) {
	this.initialize(mode,startPosition,loop,{});

	// Слой 1
	this.shape = new cjs.Shape();
	this.shape.graphics.f("#999999").s().p("AqpKpQkbkaAAmPQAAmOEbkbQEbkbGOAAQGPAAEaEbQEbEbAAGOQAAGPkbEaQkaEbmPAAQmOAAkbkbg");
	this.shape.setTransform(96.5,96.5);

	this.timeline.addTween(cjs.Tween.get(this.shape).wait(1));

}).prototype = p = new cjs.MovieClip();
p.nominalBounds = new cjs.Rectangle(0,0,193,193);


// stage content:
(lib.Proba = function(mode,startPosition,loop) {
	this.initialize(mode,startPosition,loop,{});

	// timeline functions:
	this.frame_0 = function() {
		
		setTimeout(function() {
			this.stop(); 
			alert('Boom!');
		}, 500);
	}

	this.frame_79 = function() {
		this.stop();
	}
// далее код описывающий движение...

рони 22.07.2016 11:58

Цитата:

Сообщение от butch16
this.stop();

замените this на заранее подготовленную переменную
var self = this;
setTimeout(function() {
 self.stop(); 
 alert('Boom!');
 }, 500);
 }


Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[js]
... ваш код...
[/js]


О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.

butch16 22.07.2016 12:24

Добавил, к сожалению, если раньше не было только реакции на this.stop(); в setTimeout, то теперь код просто перестал работать, ничего не запускается вообще... Объявлял переменную и внутри this.frame_0 = function() и в самом начале, результат тот же...

рони 22.07.2016 12:47

butch16,
var self = this; в строку 33 попробуйте добавить

butch16 22.07.2016 13:55

Большое спасибо! Все заработало. )

Benos 12.08.2016 10:38

что бы не плодить тему спрошу тут.
Подскажите как по средствам setTimeout вызвать функцию с параметром.
В интернете ничего не нашел.
запись вида
var timer = setTimeout(test(1), 3000);

не срабатывает.
Есть ли решение или надо городить внешние ключи(переменные)?

warren buffet 12.08.2016 10:45

Самое очевидное.

var timer = setTimeout(function(){

    test(1);

}, 3000);


С некоторых пор (как всегда все смотрят на Ишака, а именно с 10-ки) предусмотрена передача параметра, тут почитай https://developer.mozilla.org/en-US/...back_arguments

Вообще, если потребовалось передавать что-то в калбек таймера, значит что-то сделано не совсем правильно.

Benos 12.08.2016 12:19

warren buffet,
это для того что бы не плодить доп. функции. Хочу сделать их унифицированные и вызывать их с параметром.
Но вызов функций идет с задержкой по времени.
Вот и выходит... либо вызов по таймеру одной функции с разными параметрами... либо вызов по таймеру разных функций без параметров... но тогда код увеличивается :)

ksa 12.08.2016 13:46

Цитата:

Сообщение от Benos
что бы не плодить доп. функции

Как вариант...
var timer = setTimeout((function(Val){
   return function(){alert(Val)};
})('test'), 3000);

warren buffet 12.08.2016 13:53

Обрисуй нужды примерно так.

var funTimer = function(d){
    
    this.t=null,
    this.go=function(cb,param,delay){

       if(this.t) clearTimeout(this.t);
       this.t=setTimeout(function(){cb(param);},d||delay);
          
    }

};

/* usage */

var ft= new funTimer(1000);

ft.go(see_you_later,24);

/* через 1 сек запустится see_you_later(24) */


Часовой пояс GMT +3, время: 06:09.