第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用異步/等待嘗試/捕獲塊

使用異步/等待嘗試/捕獲塊

呼啦一陣風 2019-11-12 10:55:42
我正在研究節(jié)點7異步/等待功能,并不斷跨這樣的代碼絆腳function getQuote() {  let quote = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";  return quote;}async function main() {  try {    var quote = await getQuote();    console.log(quote);  } catch (error) {    console.error(error);  }}main();這似乎是使用async / await進行解析/拒絕或返回/拋出的唯一可能性,但是,v8不會在try / catch塊中優(yōu)化代碼嗎?有其他選擇嗎?
查看完整描述

3 回答

?
慕的地10843

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更適合這份工作。


我想知道什么是用例,需要拋出這么多異常。通常,拋出異常而不是返回值是一個異常。


查看完整回答
反對 回復 2019-11-12
?
12345678_0001

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塊,我覺得同樣麻煩


查看完整回答
反對 回復 2019-11-12
?
米琪卡哇伊

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

  }

}


查看完整回答
反對 回復 2019-11-12
  • 3 回答
  • 0 關注
  • 621 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號