Как упоминалось в других ответах, вероятно, есть небольшое преимущество в производительности, если вы позволите обещанию всплыть, вернув его напрямую - просто потому, что вам не нужно сначала ждать результата, а затем снова оборачивать его другим обещанием. Однако об оптимизации хвостового вызова пока никто не говорил .
Оптимизация хвостовых вызовов или «правильные хвостовые вызовы» - это метод, который интерпретатор использует для оптимизации стека вызовов. В настоящее время не многие среды выполнения поддерживают его - хотя технически это часть стандарта ES6 - но, возможно, поддержка может быть добавлена в будущем, поэтому вы можете подготовиться к этому, написав хороший код в настоящем.
В двух словах, TCO (или PTC) оптимизирует стек вызовов, не открывая новый фрейм для функции, которая напрямую возвращается другой функцией. Вместо этого он повторно использует тот же фрейм.
async function delay1Second() {
return delay(1000);
}
Поскольку delay()
он напрямую возвращается delay1Second()
, среда выполнения, поддерживающая PTC, сначала откроет фрейм для delay1Second()
(внешней функции), но затем вместо открытия другого фрейма для delay()
(внутренней функции) будет просто повторно использовать тот же фрейм, который был открыт для внешней функции. Это оптимизирует стек, потому что может предотвратить переполнение стека (хе-хе) очень большими рекурсивными функциями, например fibonacci(5e+25)
. По сути, это становится петлей, которая выполняется намного быстрее.
PTC доступен только тогда, когда внутренняя функция возвращается напрямую . Он не используется, когда результат функции изменяется до его возврата, например, если у вас был return (delay(1000) || null)
, илиreturn await delay(1000)
.
Но, как я уже сказал, большинство сред выполнения и браузеров еще не поддерживают PTC, поэтому, вероятно, сейчас это не имеет большого значения, но не повредит будущим требованиям вашего кода.
Подробнее читайте в этом вопросе: Node.js: есть ли оптимизации для хвостовых вызовов в асинхронных функциях?