promise ?中的錯(cuò)誤處理

最近太忙 好久沒(méi)有跟新了. 給自己留個(gè)坑,說(shuō)一下js 中的錯(cuò)誤處理.

分為三塊吧.
第一:普通的js中 錯(cuò)誤處理.
第二: promise 中的錯(cuò)誤處理
第三: async 中的錯(cuò)誤處理

第一: 普通的js 的錯(cuò)誤處理?
?說(shuō)普通是因?yàn)楸容^簡(jiǎn)單,算一個(gè)知識(shí)點(diǎn)沒(méi)有太多啥說(shuō)的,大家找找資料比較齊全

https://www.sitepoint.com/exceptional-exception-handling-in-javascript/

try{

? ? ...? ? //異常的拋出}

catch(e){

? ? ...? ? //異常的捕獲與處理}

finally{

? ? ...? ? //結(jié)束處理}
第二: promise 中的錯(cuò)誤處理
在promise 中處理錯(cuò)誤,我們通常也是去try catch,但是 只能catch 到同步的錯(cuò)誤,如果是異步的,比如我們settimeout一下其實(shí)是catch不到的.來(lái)個(gè)栗子:

var promise = new Promise(function(resolve, reject){

? ? setTimeout(function(){

? ? ? ? throw new Error('test')

? ? }, 0)

? ? resolve('ok'); //輸出

});

promise

? ? .then(function(value){ console.log(value) })

? ? .catch(()=> console.log('err'))


栗子

可以看到,只輸出了ok,然后瀏覽器捕獲的錯(cuò)誤,catch并沒(méi)有拿到.

然后看看我們使用reject 來(lái)拋出錯(cuò)誤


reject

可以看到,reject 會(huì)不停的返回到下一個(gè),但是并不會(huì)被catch 到.如果我們?cè)囋噒hrow 一個(gè)error呢?

throw error

通過(guò)一層層throw 在catch 里面我們是可以拿到的,疑問(wèn)來(lái)來(lái), 如果是通過(guò) 異步promise 里面reject 能catch 到么?


異步

依然是可以拿到的.

好啦最后總結(jié)一下吧.在promise 中, 如果使用reject 錯(cuò)誤,必須要再每個(gè)then函數(shù)中throw 出去,不然在catch中無(wú)法拿到.其實(shí)我們不需要再次的throw ,在promise 正常catch 就好,比如在上面的異步中我們r(jià)eject一下在最后就能catch到. 需要注意的一點(diǎn)就是:promise 中的錯(cuò)誤是不會(huì)影響外層的運(yùn)行,window.onerror 也是無(wú)法檢測(cè)到的.


第三: async 中的錯(cuò)誤處理

async用起來(lái)確實(shí)方便很多,promise 導(dǎo)致整段代碼都是promise 的then ,如果判斷太多導(dǎo)致代碼邏輯復(fù)雜難以維護(hù),而且每個(gè)then 都有自己的作用域,如果要貢獻(xiàn)數(shù)據(jù) 通常要在外層新建一個(gè).

直接貼代碼吧,看看async 正常處理異步的方式

const f = () => {

? return new Promise((resolve, reject) => {

? ? setTimeout(() => {

? ? ? reject(234);

? ? }, 2000);

? });

};

const testAsync = () => {

? try {

? ? const t = await f();

? ? console.log(t);

? } catch (err) {

? ? console.log(err);

? }

};

testAsync();

可以看到,可以使用同步的方式來(lái)處理error,但是如果判斷很多,多個(gè)異步又會(huì)導(dǎo)致到處都是判斷和try catch.因此國(guó)外的大神Dima Grossman給出了一個(gè)解決方案.直接貼官方的傳送門(mén)!

https://github.com/scopsy/await-to-js

?下面這個(gè)鏈接是一位大佬對(duì)await to js 使用中的改進(jìn).很值得一看,對(duì)優(yōu)化自己的代碼和流程很又幫助.
https://segmentfault.com/a/1190000011802045
好咯,又要去搬磚了..

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • title: promise總結(jié) 總結(jié)在前 前言 下文類似 Promise#then、Promise#resolv...
    JyLie閱讀 12,416評(píng)論 1 21
  • Promise 對(duì)象 Promise 的含義 Promise 是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函...
    neromous閱讀 8,827評(píng)論 1 56
  • 本文適用的讀者 本文寫(xiě)給有一定Promise使用經(jīng)驗(yàn)的人,如果你還沒(méi)有使用過(guò)Promise,這篇文章可能不適合你,...
    HZ充電大喵閱讀 7,448評(píng)論 6 19
  • 一、Promise的含義 Promise在JavaScript語(yǔ)言中早有實(shí)現(xiàn),ES6將其寫(xiě)進(jìn)了語(yǔ)言標(biāo)準(zhǔn),統(tǒng)一了用法...
    Alex灌湯貓閱讀 887評(píng)論 0 2
  • 這學(xué)期我們備課組在各方面都取得了顯著的進(jìn)步。 首先,大家更能齊心協(xié)力了。以往在各項(xiàng)工作中有推諉現(xiàn)象,現(xiàn)在大家都能努...
    樾媽隨筆閱讀 926評(píng)論 0 0

友情鏈接更多精彩內(nèi)容