Функции Asnyc работают асинхронно, но javascript является однопоточным, что означает, что браузер может выполнять только одну задачу за раз.То, что вы делаете внутри функции, должно быть асинхронным по своей природе, чтобы фактически заставить ее работать, однако вы, вероятно, выполнили некоторую блокирующую операцию, которая является синхронной по своей природе.Позвольте мне объяснить более подробно, приведя пример:
async function fooThatCanBeAsync(){
var result = await fetch("https://stackoverflow.com");
console.log("after async task 1");
return result;
}
async function fooThatCannotBeAsync(){
var x = 0;
for(i=0; i<10000000; i++){
x += i;
}
console.log("after async task 2");
}
fooThatCanBeAsync();
fooThatCannotBeAsync();
console.log("end...");
Приведенный выше глупый пример имеет две асинхронные функции.Однако только один из них может работать асинхронно!Первая функция пытается что-то получить, отправив http-запрос, и это займет некоторое время.Это означает, что процессор теперь свободен, пока не начнет получать результат.Сделав эту функцию async
, вы теперь можете использовать это промежуточное время для выполнения других задач.Вот как работает параллелизм в javascript.
Вторая функция выполняет цикл for, выполняя некоторые вычисления.Эти вычисления не могут быть асинхронными, потому что нет способа прервать их, нет времени ожидания между ними и нет операций ввода-вывода.Просто добавив ключевое слово async
, вы не сможете изменить тот факт, что только один поток ЦП выполняет этот код.