3 回答

TA貢獻(xiàn)1785條經(jīng)驗(yàn) 獲得超8個(gè)贊
備擇方案
替代方法:
async function main() {
try {
var quote = await getQuote();
console.log(quote);
} catch (error) {
console.error(error);
}
}
顯式地使用諾言將是這樣的:
function main() {
getQuote().then((quote) => {
console.log(quote);
}).catch((error) => {
console.error(error);
});
}
或類似的東西,使用延續(xù)傳遞樣式:
function main() {
getQuote((error, quote) => {
if (error) {
console.error(error);
} else {
console.log(quote);
}
});
}
原始例子
您原始代碼的作用是暫停執(zhí)行,然后等待返回的承諾getQuote()解決。然后,它繼續(xù)執(zhí)行,并將返回的值寫入var quote,如果承諾被解決,則將其打印出來(lái);如果承諾被拒絕,則拋出異常并運(yùn)行catch塊,打印出錯(cuò)誤。
您可以像第二個(gè)示例一樣直接使用Promise API進(jìn)行相同的操作。
性能
現(xiàn)在,為了表現(xiàn)。讓我們測(cè)試一下!
我剛才寫的代碼- f1()給1作為返回值,f2()拋出1一個(gè)例外:
function f1() {
return 1;
}
function f2() {
throw 1;
}
現(xiàn)在,我們先用一百萬(wàn)次調(diào)用相同的代碼f1():
var sum = 0;
for (var i = 0; i < 1e6; i++) {
try {
sum += f1();
} catch (e) {
sum += e;
}
}
console.log(sum);
然后讓我們更改f1()為f2():
var sum = 0;
for (var i = 0; i < 1e6; i++) {
try {
sum += f2();
} catch (e) {
sum += e;
}
}
console.log(sum);
這是我得到的結(jié)果f1:
$ time node throw-test.js
1000000
real 0m0.073s
user 0m0.070s
sys 0m0.004s
這是我得到的f2:
$ time node throw-test.js
1000000
real 0m0.632s
user 0m0.629s
sys 0m0.004s
似乎您可以在一個(gè)單線程進(jìn)程中每秒執(zhí)行200萬(wàn)次拋出。如果您要做的還不止這些,那么您可能需要擔(dān)心。
摘要
我不會(huì)擔(dān)心Node中的問題。如果像這樣的事情被廣泛使用,那么它最終將由V8或SpiderMonkey或Chakra團(tuán)隊(duì)進(jìn)行優(yōu)化,并且每個(gè)人都會(huì)效仿–這并不是說它沒有作為一個(gè)原則進(jìn)行優(yōu)化,這不是問題。
即使未進(jìn)行優(yōu)化,我仍然會(huì)爭(zhēng)辯說,如果您要在Node中使CPU發(fā)揮最大作用,那么您可能應(yīng)該使用C語(yǔ)言編寫數(shù)字運(yùn)算法則-這就是本機(jī)插件的用途?;蛘咭苍S像node.native這樣的事情比Node.js更適合這份工作。
我想知道什么是用例,需要拋出這么多異常。通常,拋出異常而不是返回值是一個(gè)異常。

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊
async function main() {
var getQuoteError
var quote = await getQuote().catch(err => { getQuoteError = err }
if (getQuoteError) return console.error(err)
console.log(quote)
}
另外,您也可以聲明一個(gè)變量而不是在頂部聲明錯(cuò)誤,而不是聲明
if (quote instanceof Error) {
// ...
}
雖然如果拋出TypeError或Reference錯(cuò)誤之類的東西,那將不起作用。您可以通過以下方式確保它是常規(guī)錯(cuò)誤
async function main() {
var quote = await getQuote().catch(err => {
console.error(err)
return new Error('Error getting quote')
})
if (quote instanceOf Error) return quote // get out of here or do whatever
console.log(quote)
}
我的偏好是將所有內(nèi)容包裝在一個(gè)大的try-catch塊中,在該塊中創(chuàng)建了多個(gè)promise,這使得處理錯(cuò)誤(特別是針對(duì)創(chuàng)建它的promise)變得很麻煩。另一種選擇是多個(gè)try-catch塊,我覺得同樣麻煩

TA貢獻(xiàn)1998條經(jīng)驗(yàn) 獲得超6個(gè)贊
與Golang中的錯(cuò)誤處理類似的替代方法
因?yàn)閍sync / await在幕后使用promises,所以您可以編寫一個(gè)小的實(shí)用程序函數(shù),如下所示:
export function catchEm(promise) {
return promise.then(data => [null, data])
.catch(err => [err]);
}
然后,在需要捕獲一些錯(cuò)誤時(shí)將其導(dǎo)入,并包裝異步函數(shù),該函數(shù)將返回一個(gè)Promise。
import catchEm from 'utility';
async performAsyncWork() {
const [err, data] = await catchEm(asyncFunction(arg1, arg2));
if (err) {
// handle errors
} else {
// use data
}
}
- 3 回答
- 0 關(guān)注
- 633 瀏覽
添加回答
舉報(bào)