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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

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

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

呼啦一陣風(fēng) 2019-11-12 10:55:42
我正在研究節(jié)點(diǎn)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進(jìn)行解析/拒絕或返回/拋出的唯一可能性,但是,v8不會(huì)在try / catch塊中優(yōu)化代碼嗎?有其他選擇嗎?
查看完整描述

3 回答

?
慕的地10843

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è)異常。


查看完整回答
反對(duì) 回復(fù) 2019-11-12
?
12345678_0001

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


查看完整回答
反對(duì) 回復(fù) 2019-11-12
?
米琪卡哇伊

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

  }

}


查看完整回答
反對(duì) 回復(fù) 2019-11-12
  • 3 回答
  • 0 關(guān)注
  • 633 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)