Seperti jawaban lain yang disebutkan, kemungkinan ada sedikit manfaat kinerja saat membiarkan janji meluap dengan mengembalikannya secara langsung - hanya karena Anda tidak harus menunggu hasilnya terlebih dahulu dan kemudian membungkusnya dengan janji lain lagi. Namun, belum ada yang berbicara tentang pengoptimalan panggilan ekor .
Pengoptimalan panggilan ekor , atau "panggilan ekor yang tepat" , adalah teknik yang digunakan interpreter untuk mengoptimalkan tumpukan panggilan. Saat ini, belum banyak runtime yang mendukungnya - meskipun secara teknis merupakan bagian dari Standar ES6 - tetapi kemungkinan dukungan itu mungkin ditambahkan di masa mendatang, sehingga Anda dapat mempersiapkannya dengan menulis kode yang baik saat ini.
Singkatnya, TCO (atau PTC) mengoptimalkan tumpukan panggilan dengan tidak membuka bingkai baru untuk fungsi yang langsung dikembalikan oleh fungsi lain. Sebaliknya, itu menggunakan kembali bingkai yang sama.
async function delay1Second() {
return delay(1000);
}
Karena delay()
langsung dikembalikan oleh delay1Second()
, runtime yang mendukung PTC pertama-tama akan membuka bingkai untuk delay1Second()
(fungsi luar), tetapi alih-alih membuka bingkai lain untuk delay()
(fungsi bagian dalam), itu hanya akan menggunakan kembali bingkai yang sama yang dibuka untuk fungsi luar. Ini mengoptimalkan stack karena dapat mencegah stack overflow (hehe) dengan fungsi rekursif yang sangat besar, mis fibonacci(5e+25)
. Pada dasarnya ini menjadi loop, yang jauh lebih cepat.
PTC hanya diaktifkan ketika fungsi bagian dalam langsung dikembalikan. Ini tidak digunakan ketika hasil dari fungsi diubah sebelum dikembalikan, misalnya, jika Anda memiliki return (delay(1000) || null)
, atau return await delay(1000)
.
Tapi seperti yang saya katakan, sebagian besar runtime dan browser belum mendukung PTC, jadi mungkin sekarang tidak membuat perbedaan besar, tetapi tidak ada salahnya untuk membuktikan kode Anda di masa mendatang.
Baca lebih lanjut dalam pertanyaan ini: Node.js: Apakah ada pengoptimalan untuk panggilan ekor dalam fungsi asinkron?