Короткая версия: asyn c не делает больше, чем одну вещь одновременно. Он переключается между задачами (с дополнительными затратами для каждого коммутатора) в очереди, и когда одна задача блокируется, он передает управление другому (с дополнительными затратами для коммутатора и перезаписывает заблокированную задачу при разблокировании).
Длинная версия: Asyn c не означает параллельная обработка, это означает чередующаяся (одновременная, совместная) обработка. JavaScript по-прежнему однопоточен даже при использовании асинхронного c, и вся выполняемая вами работа связана исключительно с ЦП. Фактически, ваш единственный реальный параллелизм состоит в том, что асиновый код c будет планировать, приостанавливать и возобновлять ваши рекурсивные вызовы несколько раз (но все равно будет выполнять работу только по одному за раз), в то время как код syn c будет их выполнять. чтобы как можно быстрее, без участия l oop.
Преимущество асин c кода состоит в том, что при блокировке ввода / вывода (включая такие вещи, как ожидание при вводе данных пользователем), эта задача может быть приостановлена до тех пор, пока она не будет заблокирована каким-либо внеполосным сигналом (ввод / вывод выполнен, пользователь щелкнул мышью и т. д.) и другие задачи не могут быть запущены. Преимущество состоит в том, чтобы пожинать преимущества параллельной (но не параллельной) обработки в ситуациях, когда большинство задач большую часть времени чего-то ждут, поэтому те немногие, которые готовы к запуску, могут начать работать немедленно (и, поскольку они обычно не работает, накладные расходы на переключение задач не имеют большого значения, в большинстве случаев переключаться не на что, большая часть накладных расходов оплачивается, когда вам нечего делать). Но это определенно выше, чем просто перехват номера без паузы.