Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 22.02.2020, 14:03
Новичок на форуме
Отправить личное сообщение для fjay69 Посмотреть профиль Найти все сообщения от fjay69
 
Регистрация: 22.02.2020
Сообщений: 2

Создание функции в цикле, замыкания, промисы
Добрый день!
Пишу юзерскрипт.
Есть примерно такой код:
function runTest(){
	let callback = () => {
		console.log("Done");
	};
	let promises = [];
	let i = 0;
	let someFunct = resolve => {
		setTimeout(()=>{
			console.log(i); //Всегда 10
			resolve();
		}, 100);
	};

	for (; i<10; i++){
		promises.push(new Promise(someFunct));
	}

	Promise.all(promises).then(() => callback());
}

В консоль 10 раз подряд выводится 10. Что я делаю не так?
Если убрать setTimeout, работает нормально, но представьте себе, что тут get-запрос...
Я могу поместить создание функции в цикл:
function runTest(){
	let callback = () => {
		console.log("Done");
	};
	let promises = [];

	for (let i = 0; i<10; i++){
		let someFunct = resolve => {
			setTimeout(()=>{
				console.log(i);
				resolve();
			}, 100);
		};
		promises.push(new Promise(someFunct));
	}

	Promise.all(promises).then(() => callback());
}

и тогда всё работает, но Tampermonkey не советует так делать (предупреждение "Создание функции в цикле"). Как быть?
Ответить с цитированием
  #2 (permalink)  
Старый 22.02.2020, 14:36
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,795

Попробуйте так:
function runTest(){
	let promises = [];
	
	for (let i = 0; i<10; i++){
        const getPromise = i => new Promise(resolve => {
            setTimeout(()=>{
                console.log(i);
                
                resolve();
            }, 100);
        });
        
		promises.push(
            getPromise(i)
        );
	}

	Promise.all(promises).then(() => {
		console.log("Done");
	});
}
Ответить с цитированием
  #3 (permalink)  
Старый 22.02.2020, 14:43
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,590

Nexus имел ввиду вот так:
function runTest(){
	let promises = [];
        const getPromise = i => new Promise(resolve => {
            setTimeout(()=>{
                console.log(i);
                
                resolve();
            }, 100);
        });	

	for (let i = 0; i<10; i++){
		promises.push(
            getPromise(i)
        );
	}

	Promise.all(promises).then(() => {
		console.log("Done");
	});
}

Только это всё равно создание функций в цикле.)
И в принципе это абсолютно нормально для таких случаев, любые альтернативы имеют мало смысла.
Tampermonkey тут идёт нафиг.
__________________
29375, 35
Ответить с цитированием
  #4 (permalink)  
Старый 22.02.2020, 14:57
Новичок на форуме
Отправить личное сообщение для fjay69 Посмотреть профиль Найти все сообщения от fjay69
 
Регистрация: 22.02.2020
Сообщений: 2

Спасибо за ответы!
Ответить с цитированием
  #5 (permalink)  
Старый 22.02.2020, 16:13
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,795

Aetae, нет, я просто ошибся объявив функцию в цикле.
Спасибо, что поправили
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объясните пример замыкания функции из книги SpZm1ro Учебные материалы 2 26.04.2019 21:02
Создание запроса с помощью функции Otokosan Общие вопросы Javascript 2 08.06.2016 13:04
Создание прототипа функции Chiz Events/DOM/Window 8 30.10.2013 22:31
Создание функции realpoc Ваши сайты и скрипты 1 07.08.2013 23:36
Создание примитива с таким же именем как у уже существующего свойства функции lancer Общие вопросы Javascript 7 29.07.2013 20:23