Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Request Animation Frame кэшируется или фича? (https://javascript.ru/forum/misc/66578-request-animation-frame-kehshiruetsya-ili-ficha.html)

xShift 24.12.2016 19:54

Request Animation Frame кэшируется или фича?
 
В общем вот такой код:

var tr = ['test','test1','test2','test3'];
		var t  = 5000;
		var s = performance.now();

		for(var i in tr) {

			requestAnimationFrame(
				function frame(d) {

					// g - time gone
					var g = d - s;

					// time escape preventing
					if (g > t) { 
						g = t;
					}

					console.log(tr[i])


					// animation time is over? if not next frame
					if (g < t) {
						requestAnimationFrame(frame);
					} 
				}
			);

		}


Расконсоливание выводит одну и ту же переменную из массива.
Что это следствие кэширования, где-то моя тупость из-за усталости или фича.

Обойти можно вот так:

var tr = ['test','test1','test2','test3'];
		var t  = 5000;
		var s = performance.now();

		for(var i in tr) {

			(function animloop(x) {
				requestAnimationFrame(
					function frame(d) {

						// g - time gone
						var g = d - s;

						// time escape preventing
						if (g > t) { 
							g = t;
						}

						console.log(x)


						// animation time is over? if not next frame
						if (g < t) {
							requestAnimationFrame(frame);
						} 
					}
				);
			})(tr[i]);
		}


тоесть оборачиванием в iife мы устраняем эффект "кэширования" функции.

Это что? Фича такая или я уже замылился и что-то натупил?

Malleys 24.12.2016 20:01

в первом примере асинхронная requestAnimationFrame вызовет функцию уже после того, как массив был пройден, соответственно i == 3

xShift 24.12.2016 20:06

Цитата:

Сообщение от Malleys (Сообщение 438851)
в первом примере асинхронная requestAnimationFrame вызовет функцию уже после того, как массив был пройден, соответственно i == 3

видимо так ... спасибо

рони 24.12.2016 22:12

Цитата:

Сообщение от xShift
for(var i in tr)

foreach

xShift 25.12.2016 10:32

Цитата:

Сообщение от рони (Сообщение 438859)

Может я экономлю на спичках, но мне всегда казалось, что фор ин в разы быстрее и экономичнее. Для обьектов да - лучне форыч, но для массивов мне фор кажется красивее.

рони 25.12.2016 10:48

Цитата:

Сообщение от xShift
})(tr[i]);

у вас тотже foreach по сути

xShift 25.12.2016 16:02

По сути да, но это же частный случай...


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