Jak wspomniano w innych odpowiedziach, prawdopodobnie istnieje niewielka poprawa wydajności, gdy obietnica pojawi się, zwracając ją bezpośrednio - po prostu dlatego, że nie musisz najpierw czekać na wynik, a następnie zawijać go ponownie. Jednak nikt jeszcze nie mówił o optymalizacji połączeń końcowych .
Optymalizacja wywołań ogonowych lub „właściwe wywołania ogonowe” to technika, której interpreter używa do optymalizacji stosu wywołań. Obecnie niewiele środowisk wykonawczych jeszcze go obsługuje - mimo że jest technicznie częścią standardu ES6 - ale możliwe jest, że w przyszłości zostanie dodana obsługa, więc możesz się do tego przygotować, pisząc dobry kod w teraźniejszości.
Krótko mówiąc, TCO (lub PTC) optymalizuje stos wywołań, nie otwierając nowej ramki dla funkcji, która jest bezpośrednio zwracana przez inną funkcję. Zamiast tego ponownie wykorzystuje tę samą ramkę.
async function delay1Second() {
return delay(1000);
}
Ponieważ delay()
jest zwracana bezpośrednio przez delay1Second()
, środowiska wykonawcze obsługujące PTC najpierw otworzą ramkę dla delay1Second()
(funkcji zewnętrznej), ale zamiast otwierać kolejną ramkę dla delay()
(funkcji wewnętrznej), po prostu ponownie wykorzystają tę samą ramkę, która została otwarta dla funkcji zewnętrznej. Optymalizuje to stos, ponieważ może zapobiec przepełnieniu stosu (hehe) z bardzo dużymi funkcjami rekurencyjnymi, np fibonacci(5e+25)
.. Zasadniczo staje się pętlą, która jest znacznie szybsza.
PTC jest aktywowane tylko wtedy, gdy funkcja wewnętrzna jest zwracana bezpośrednio . Nie jest używany, gdy wynik funkcji jest zmieniany przed jego zwróceniem, na przykład jeśli miałeś return (delay(1000) || null)
lub return await delay(1000)
.
Ale jak powiedziałem, większość środowisk wykonawczych i przeglądarek nie obsługuje jeszcze PTC, więc prawdopodobnie nie robi to teraz dużej różnicy, ale nie zaszkodzi, aby Twój kod był zabezpieczony w przyszłości.
Przeczytaj więcej w tym pytaniu: Node.js: Czy istnieją optymalizacje wywołań ogonowych w funkcjach asynchronicznych?