Alternatifler
Buna bir alternatif:
async function main() {
try {
var quote = await getQuote();
console.log(quote);
} catch (error) {
console.error(error);
}
}
açıkça vaatleri kullanarak böyle bir şey olurdu:
function main() {
getQuote().then((quote) => {
console.log(quote);
}).catch((error) => {
console.error(error);
});
}
veya bunun gibi, devam eden geçiş stilini kullanarak:
function main() {
getQuote((error, quote) => {
if (error) {
console.error(error);
} else {
console.log(quote);
}
});
}
Orijinal örnek
Orijinal kodunuzun yaptığı, yürütmeyi askıya almak ve tarafından verilen sözün yerine getirilmesini beklemektir getQuote()
. Daha sonra yürütmeye devam eder ve döndürülen değeri üzerine yazar var quote
ve ardından söz çözülmüşse bunu yazdırır veya bir istisna atar ve söz reddedilmişse hatayı yazdıran catch bloğunu çalıştırır.
İkinci örnekte olduğu gibi doğrudan Promise API'yi kullanarak aynı şeyi yapabilirsiniz.
Verim
Şimdi, performans için. Hadi test edelim!
Bu kodu az önce yazdım - bir dönüş değeri olarak f1()
verir 1
, bir istisna olarak f2()
atar 1
:
function f1() {
return 1;
}
function f2() {
throw 1;
}
Şimdi aynı kodu milyon kez arayalım, ilk olarak f1()
:
var sum = 0;
for (var i = 0; i < 1e6; i++) {
try {
sum += f1();
} catch (e) {
sum += e;
}
}
console.log(sum);
Sonra 's değişikliği izin f1()
için f2()
:
var sum = 0;
for (var i = 0; i < 1e6; i++) {
try {
sum += f2();
} catch (e) {
sum += e;
}
}
console.log(sum);
Aldığım sonuç bu f1
:
$ time node throw-test.js
1000000
real 0m0.073s
user 0m0.070s
sys 0m0.004s
Bunun için aldım f2
:
$ time node throw-test.js
1000000
real 0m0.632s
user 0m0.629s
sys 0m0.004s
Tek iş parçacıklı bir işlemde saniyede 2 milyon atış gibi bir şey yapabileceğiniz anlaşılıyor. Bundan fazlasını yapıyorsanız, endişelenmeniz gerekebilir.
özet
Node'da böyle şeyler için endişelenmem. Böyle şeyler çok kullanılırsa, sonunda V8 veya SpiderMonkey veya Chakra ekipleri tarafından optimize edilecek ve herkes takip edecek - bu prensip olarak optimize edilmemiş gibi değil, sadece sorun değil.
Optimize edilmemiş olsa bile, CPU'nuzu Node'da maksimize ediyorsanız, muhtemelen sayınızı C ile yazmanız gerektiğini savunabilirim - diğer şeylerin yanı sıra yerel eklentiler bunun içindir. Ya da belki node.native gibi şeyler iş için Node.js'den daha uygun olabilir.
Bu kadar çok istisnanın atılması gereken bir kullanım durumunun ne olacağını merak ediyorum. Genellikle bir değer döndürmek yerine bir istisna atmak bir istisnadır.