3 回答

TA貢獻1785條經(jīng)驗 獲得超8個贊
備擇方案
替代方法:
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,如果承諾被解決,則將其打印出來;如果承諾被拒絕,則拋出異常并運行catch塊,打印出錯誤。
您可以像第二個示例一樣直接使用Promise API進行相同的操作。
性能
現(xiàn)在,為了表現(xiàn)。讓我們測試一下!
我剛才寫的代碼- f1()給1作為返回值,f2()拋出1一個例外:
function f1() {
return 1;
}
function f2() {
throw 1;
}
現(xiàn)在,我們先用一百萬次調用相同的代碼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);
這是我得到的結果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
似乎您可以在一個單線程進程中每秒執(zhí)行200萬次拋出。如果您要做的還不止這些,那么您可能需要擔心。
摘要
我不會擔心Node中的問題。如果像這樣的事情被廣泛使用,那么它最終將由V8或SpiderMonkey或Chakra團隊進行優(yōu)化,并且每個人都會效仿–這并不是說它沒有作為一個原則進行優(yōu)化,這不是問題。
即使未進行優(yōu)化,我仍然會爭辯說,如果您要在Node中使CPU發(fā)揮最大作用,那么您可能應該使用C語言編寫數(shù)字運算法則-這就是本機插件的用途?;蛘咭苍S像node.native這樣的事情比Node.js更適合這份工作。
我想知道什么是用例,需要拋出這么多異常。通常,拋出異常而不是返回值是一個異常。

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

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