Come accennato in altre risposte, è probabile che vi sia un leggero vantaggio in termini di prestazioni quando si lascia che la promessa sgorghi restituendola direttamente, semplicemente perché non è necessario attendere prima il risultato e poi avvolgerlo di nuovo con un'altra promessa. Tuttavia, nessuno ha ancora parlato di ottimizzazione delle chiamate di coda .
L'ottimizzazione delle chiamate di coda , o "chiamate di coda appropriate" , è una tecnica che l'interprete utilizza per ottimizzare lo stack di chiamate. Attualmente, non molti runtime lo supportano ancora , anche se tecnicamente fa parte dello standard ES6 , ma è possibile che il supporto venga aggiunto in futuro, quindi puoi prepararti scrivendo un buon codice nel presente.
In poche parole, TCO (o PTC) ottimizza lo stack di chiamate non aprendo un nuovo frame per una funzione che viene restituita direttamente da un'altra funzione. Invece, riutilizza lo stesso frame.
async function delay1Second() {
return delay(1000);
}
Poiché delay()viene restituito direttamente da delay1Second(), i runtime che supportano PTC apriranno prima un frame per delay1Second()(la funzione esterna), ma poi invece di aprire un altro frame per delay()(la funzione interna), riutilizzerà semplicemente lo stesso frame che è stato aperto per la funzione esterna. Questo ottimizza lo stack perché può impedire un overflow dello stack (hehe) con funzioni ricorsive molto grandi, ad esempio fibonacci(5e+25). Essenzialmente diventa un loop, che è molto più veloce.
PTC è abilitato solo quando viene restituita direttamente la funzione interna . Non viene utilizzato quando il risultato della funzione viene modificato prima di essere restituito, ad esempio, se si aveva return (delay(1000) || null), o return await delay(1000).
Ma come ho detto, la maggior parte dei runtime e dei browser non supporta ancora PTC, quindi probabilmente non fa una grande differenza ora, ma non potrebbe far male a rendere il tuo codice a prova di futuro.
Leggi di più in questa domanda: Node.js: ci sono ottimizzazioni per le chiamate tail nelle funzioni asincrone?