Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

JS не получается выполнить код параллельно

Ruslan Goblin Профи (918), на голосовании 4 месяца назад
Пытаюсь разобраться в Async/Await на JS, накидал код и почему то выполняется синхронно, сначала 20 раз печатает "i am raccoon" потом 20 раз "i am rabbit", а мне надо чтобы оба печатали одновременно, примерно так
"i am raccoon 0"
"i am rabbit 0"
"i am raccoon 1"
"i am rabbit 1"
"i am raccoon 2"
"i am rabbit 2"

в сишарпе так работало а здесь нет, почему?
 function printStringLog(str){
console.log(str);
}

function delay(milliSecond){
const start = new Date().getTime();
for(let i = 0; i < 1e7; i++){
if((new Date().getTime() - start) > milliSecond)
break;
}
}

function printMultipleString(str){
for(let i = 0; i < 20; i++){
printStringLog(str + ' ' + i)
delay(100);
}
}

function raccoon()
{
return new Promise((resolve, reject)=>{
setTimeout(()=>{printMultipleString('i am raccoon');
resolve("finish raccoon")}, 1);
});
}

function rabbit()
{
return new Promise((resolve, reject)=>{
setTimeout(()=>{printMultipleString('i am rabbit');
resolve("finish rabbit")}, 1);
});
}

async function go(){
const res1 = raccoon();
const res2 = rabbit();
const [r1, r2] = await Promise.all([res1,res2]);
console.log(r1, r2);
}

go();
Голосование за лучший ответ
Татьяна Просветленный (36374) 5 месяцев назад
Проблема здесь в том, что функция printMultipleString вызывает delay в цикле, что блокирует выполнение кода и делает его синхронным. Вместо этого вы можете использовать setTimeout для имитации задержки без блокировки основного потока выполнения.
Как вы можете переписать функцию printMultipleString:
 async function printMultipleString(str) { 
for (let i = 0; i < 20; i++) {
await new Promise(resolve => setTimeout(resolve, 100)); // Имитация задержки
printStringLog(str + ' ' + i);
}
}
Ruslan GoblinПрофи (918) 5 месяцев назад
Спасибо, теперь асинхронно выполняется.
Точно, основной поток был заблокирован, ведь в сишарпе я писал Thread.Sleep() и там основной поток не был заблокирован.
Похожие вопросы