Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Фоновое выполнение скрипта (https://javascript.ru/forum/misc/76522-fonovoe-vypolnenie-skripta.html)

AleksSergSB 19.01.2019 12:56

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

Но эксперимент над скриптом:
async function assinchrone(){
	return new Promise((resolve) => {
		let i, test;
		console.log("promise Start")
		for (i=0;i<10000;i++){
			test+=i;
		}
		console.log("promise END"+i)
		resolve(i);
	})
	
}
console.log("start")
assinchrone()
	.then((res) => console.log("ответ: "+res));
console.log("end")
показывает:
start
promise Start
promise END10000
end

Получается, что assinchrone() заблокировал дальнейшее выполнение скрипта. Но мне нужно фоновое выполнение асинхронной функции.
Или Асинк Авейт с Промисами предназначены только для последовательного выполнения(с ожиданием на получение результата) и нельзя реализовать фоновое выполнение?

AleksSergSB 19.01.2019 13:23

Варианты:
function assinchrone(){
	return new Promise((resolve) => {
		resolve() // не слишком ли жуткий костыль?
	})
}
console.log("start")
assinchrone()
	.then((res) => {
		let test,i;
		console.log("promise Start")
		for (i=0;i<100000;i++){
			test=polygonControl.getStartCoordinats();
		}
		console.log("promise END"+i)
	})
console.log("end")

выполняется так как мне надо:
start
end
promise Start
promise END100000

Ну или воткнуть в ассинхрон сетТаймАут с нулевым значением. Но это как-то выглядит жесть костыльно. Есть более "правильные" способы?

AleksSergSB 19.01.2019 13:54

Вопрос снят.
Для управления очередями нужно использовать setImmediate() и process.nextTick()

Для ищущих аналогичный ответ.
Мой пример должен выглядеть так:
console.log("start")
process.nextTick(()=>{
	let test,i;
	console.log("asynchrone Start")
	for (i=0;i<100000;i++){
		test+=i;
	}
	console.log("asynchrone END"+i)
})
console.log("end")

process.nextTick() выполняется сразу после основного скрипта.
senImmediate() в общей очереди, не пропускает впереди себя только таймаутные функции.

Всем спасибо :-)


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