Вы абсолютно правы.
Я хотел бы поделиться другой точкой зрения о том, почему это не работает:
JavaScript имеет параллелизм на основе задач, что означает, что код разбит на маленькие «куски» (задачи)и один из них исполняется одновременно.Если у вас есть что-то асинхронное, которое разделено на несколько задач: одно для запуска асинхронного действия и одно для работы с результатами после выполнения асинхронного действия.В то же время могут выполняться другие задачи, что обеспечивает параллелизм.
Теперь наименьший возможный фрагмент выполнения был (до async
) функцией: функция всегда выполняется до завершения, вы не можете разделитьфункция в несколько задач.
С введением ключевого слова async
есть функции async
, которые не выполняются до конца.Они будут разбиты на более мелкие задачи (через await
с).
Теперь, если вам нужно перевести async function
в обычный function
, у вас есть одна проблема: вы не можете разделить задачи.Следовательно, вам нужно несколько функций для представления одной async function
:
async function(arg) { await a(); await b(); }
// becomes
function(arg) { return a().then(function () { b(); }); }
Теперь, как можно видеть, это не происходит точно: хотя arg
был аргументом единственной async
функции, только внешняяфункция имеет это arg
.Однако, как правило, это не проблема, если вы получаете доступ к arg
в текущей области или во внешней области, это не меняет способ работы (за исключением того, что вы переименовываете его).
Однако есть одна вещь, которая была изменена и которая составила этот ответ: arguments
.Поскольку у нас есть две функции, у нас есть два arguments
объекта.Теперь можно также имитировать объект arguments
, но тогда вам придется использовать другие неподдерживаемые новые языковые функции (геттеры / сеттеры, прокси).И, честно говоря: вы не должны использовать arguments
, поэтому его перенос не стоит.