Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.12.2016, 19:54
Аватар для xShift
Профессор
Отправить личное сообщение для xShift Посмотреть профиль Найти все сообщения от xShift
 
Регистрация: 22.11.2016
Сообщений: 212

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 мы устраняем эффект "кэширования" функции.

Это что? Фича такая или я уже замылился и что-то натупил?
Ответить с цитированием
  #2 (permalink)  
Старый 24.12.2016, 20:01
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

в первом примере асинхронная requestAnimationFrame вызовет функцию уже после того, как массив был пройден, соответственно i == 3
Ответить с цитированием
  #3 (permalink)  
Старый 24.12.2016, 20:06
Аватар для xShift
Профессор
Отправить личное сообщение для xShift Посмотреть профиль Найти все сообщения от xShift
 
Регистрация: 22.11.2016
Сообщений: 212

Сообщение от Malleys Посмотреть сообщение
в первом примере асинхронная requestAnimationFrame вызовет функцию уже после того, как массив был пройден, соответственно i == 3
видимо так ... спасибо
Ответить с цитированием
  #4 (permalink)  
Старый 24.12.2016, 22:12
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,123

Сообщение от xShift
for(var i in tr)
foreach
Ответить с цитированием
  #5 (permalink)  
Старый 25.12.2016, 10:32
Аватар для xShift
Профессор
Отправить личное сообщение для xShift Посмотреть профиль Найти все сообщения от xShift
 
Регистрация: 22.11.2016
Сообщений: 212

Сообщение от рони Посмотреть сообщение
foreach
Может я экономлю на спичках, но мне всегда казалось, что фор ин в разы быстрее и экономичнее. Для обьектов да - лучне форыч, но для массивов мне фор кажется красивее.
Ответить с цитированием
  #6 (permalink)  
Старый 25.12.2016, 10:48
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,123

Сообщение от xShift
})(tr[i]);
у вас тотже foreach по сути
Ответить с цитированием
  #7 (permalink)  
Старый 25.12.2016, 16:02
Аватар для xShift
Профессор
Отправить личное сообщение для xShift Посмотреть профиль Найти все сообщения от xShift
 
Регистрация: 22.11.2016
Сообщений: 212

По сути да, но это же частный случай...
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Интереснейший баг или фича) Georrg Ваши сайты и скрипты 1 23.09.2014 16:40
как получить загружений урл iframe или frame NOCaut Events/DOM/Window 0 15.11.2011 14:51
Странность при вычислении выражений.. Это баг или фича? krvwd Общие вопросы Javascript 9 28.01.2009 18:04