Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Создание функции в цикле, замыкания, промисы (https://javascript.ru/forum/misc/79561-sozdanie-funkcii-v-cikle-zamykaniya-promisy.html)

fjay69 22.02.2020 14:03

Создание функции в цикле, замыкания, промисы
 
Добрый день!
Пишу юзерскрипт.
Есть примерно такой код:
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 не советует так делать (предупреждение "Создание функции в цикле"). Как быть?

Nexus 22.02.2020 14:36

Попробуйте так:
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");
	});
}

Aetae 22.02.2020 14:43

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 тут идёт нафиг.

fjay69 22.02.2020 14:57

Спасибо за ответы!

Nexus 22.02.2020 16:13

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


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