Alternatif
Alternatif untuk ini:
async function main() {
try {
var quote = await getQuote();
console.log(quote);
} catch (error) {
console.error(error);
}
}
akan menjadi seperti ini, menggunakan promise secara eksplisit:
function main() {
getQuote().then((quote) => {
console.log(quote);
}).catch((error) => {
console.error(error);
});
}
atau sesuatu seperti ini, menggunakan gaya passing lanjutan:
function main() {
getQuote((error, quote) => {
if (error) {
console.error(error);
} else {
console.log(quote);
}
});
}
Contoh asli
Apa yang dilakukan kode asli Anda adalah menangguhkan eksekusi dan menunggu janji dikembalikan getQuote()
untuk diselesaikan. Kemudian melanjutkan eksekusi dan menulis nilai yang dikembalikan ke var quote
dan kemudian mencetaknya jika promise telah diselesaikan, atau melontarkan pengecualian dan menjalankan blok catch yang mencetak error jika promise tersebut ditolak.
Anda dapat melakukan hal yang sama menggunakan Promise API secara langsung seperti pada contoh kedua.
Performa
Sekarang, untuk pertunjukannya. Mari kita uji!
Saya baru saja menulis kode ini - f1()
memberikan 1
nilai pengembalian, f2()
melempar 1
sebagai pengecualian:
function f1() {
return 1;
}
function f2() {
throw 1;
}
Sekarang mari kita panggil kode yang sama jutaan kali, pertama dengan f1()
:
var sum = 0;
for (var i = 0; i < 1e6; i++) {
try {
sum += f1();
} catch (e) {
sum += e;
}
}
console.log(sum);
Dan kemudian mari beralih f1()
ke f2()
:
var sum = 0;
for (var i = 0; i < 1e6; i++) {
try {
sum += f2();
} catch (e) {
sum += e;
}
}
console.log(sum);
Inilah hasil yang saya dapat f1
:
$ time node throw-test.js
1000000
real 0m0.073s
user 0m0.070s
sys 0m0.004s
Inilah yang saya dapatkan untuk f2
:
$ time node throw-test.js
1000000
real 0m0.632s
user 0m0.629s
sys 0m0.004s
Tampaknya Anda dapat melakukan sesuatu seperti 2 juta lemparan per detik dalam satu proses utas tunggal. Jika Anda melakukan lebih dari itu, Anda mungkin perlu mengkhawatirkannya.
Ringkasan
Saya tidak akan mengkhawatirkan hal-hal seperti itu di Node. Jika hal-hal seperti itu sering digunakan maka itu akan dioptimalkan pada akhirnya oleh tim V8 atau SpiderMonkey atau Chakra dan semua orang akan mengikutinya - ini tidak seperti itu tidak dioptimalkan sebagai prinsip, itu hanya bukan masalah.
Bahkan jika itu tidak dioptimalkan maka saya masih berpendapat bahwa jika Anda memaksimalkan CPU Anda di Node maka Anda mungkin harus menulis nomor Anda berderak di C - itulah tujuan dari add-on asli, antara lain. Atau mungkin hal-hal seperti node.native akan lebih cocok untuk pekerjaan itu daripada Node.js.
Saya bertanya-tanya apa yang akan menjadi kasus penggunaan yang perlu membuang begitu banyak pengecualian. Biasanya melempar pengecualian daripada mengembalikan nilai adalah pengecualian.