摘要:定時(shí)器為狀態(tài)聲明的函數(shù)配合按步驟自動(dòng)執(zhí)行類型自動(dòng)執(zhí)行器執(zhí)行或者,使用捕獲異常若是狀態(tài),拋出異常,函數(shù)體內(nèi)的捕獲
async/await 中的try/catch
es6中的async是異步編程的終極解決方案,近期學(xué)習(xí)了一下,相對(duì)于 generator 來(lái)說(shuō),具有更好的特性:內(nèi)置執(zhí)行器、更好的語(yǔ)義、更好的適用性,需要注意一點(diǎn)的是 await 后面是promise 對(duì)象或者原始類型的值。
更有意思的是可以使用 try/catch 來(lái)捕獲異步中出現(xiàn)的異常
// 定時(shí)器 function timer(params) { return new Promise(function (resolve, reject) { setTimeout(function () { // resolve("resolve"); reject("reject"); }, params); }) } // async/await async function fn(params) { try { var value = await timer(params); } catch (error) { console.log(error); } } fn(1000); //執(zhí)行
promise的狀態(tài)變?yōu)?rejected 之后會(huì)跳轉(zhuǎn)到 catch
內(nèi)部實(shí)現(xiàn)看了阮一峰老師的博客后,恍然大悟,原來(lái)是用 Generator.prototype.throw 和
Generator.prototype.next 來(lái)實(shí)現(xiàn)自動(dòng)執(zhí)行及異常拋出。
// 定時(shí)器 function timer(params) { return new Promise(function (resolve, reject) { setTimeout(function () { // resolve("resolve"); reject("reject"); // next.value 為 rejected 狀態(tài) }, params); }) } // aysnc 聲明的函數(shù) function fn(args) { return spawn(function* () { // 配合 next 按步驟自動(dòng)執(zhí)行 try { yield timer(args); // timer Promise類型 } catch (error) { console.log(error); } }); } // 自動(dòng)執(zhí)行器 function spawn(genF) { return new Promise(function (resolve, reject) { var gen = genF(); function step(nextF) { try { var next = nextF(); // 執(zhí)行 gen.next 或者 gen.throw ,使用 try/catch 捕獲異常 } catch (e) { return reject(e); } if (next.done) { return resolve(next.value); } Promise.resolve(next.value).then(function (v) { step(function () { return gen.next(v); }); }, function (e) { step(function () { return gen.throw(e); // 若 next.value 是 rejected 狀態(tài),拋出異常,函數(shù)體內(nèi)的try/catch捕獲 }); }); } step(function () { return gen.next(undefined); }); }); } fn(100).then(function (data) { console.log(data) }).catch(function (error) { console.log(error); })
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/89482.html
摘要:能夠捕獲非異步的異常。來(lái)匹配正常異常的情況。在中處理所有的異常如果出錯(cuò),則退出。所以,的模式使得異常處理變得非常簡(jiǎn)潔。自從年雙十一正式上線,累計(jì)處理了億錯(cuò)誤事件,付費(fèi)客戶有陽(yáng)光保險(xiǎn)核桃編程荔枝掌門對(duì)微脈青團(tuán)社等眾多品牌企業(yè)。 譯者按: 使用.catch()來(lái)捕獲所有的異常 原文: Async Await Error Handling in JavaScript 譯者: Fundeb...
摘要:像這種中斷式的錯(cuò)誤處理,其實(shí)正適合采用。然而注意,上面的代碼中并沒(méi)有直接使用,而是使用了自定義的錯(cuò)誤消息。所以需要對(duì)出來(lái)的進(jìn)一步處理成指定的錯(cuò)誤消息。 前不久看到 Dima Grossman 寫的 How to write async await without try-catch blocks in Javascript??吹綐?biāo)題的時(shí)候,我感到非常好奇。我知道雖然在異步程序中可以不使...
摘要:標(biāo)準(zhǔn)引入了函數(shù),使得異步操作變得更加方便。在異步處理上,函數(shù)就是函數(shù)的語(yǔ)法糖。在實(shí)際項(xiàng)目中,錯(cuò)誤處理邏輯可能會(huì)很復(fù)雜,這會(huì)導(dǎo)致冗余的代碼。的出現(xiàn)使得就可以捕獲同步和異步的錯(cuò)誤。如果有錯(cuò)誤或者不嚴(yán)謹(jǐn)?shù)牡胤?,?qǐng)務(wù)必給予指正,十分感謝。 async ES2017 標(biāo)準(zhǔn)引入了 async 函數(shù),使得異步操作變得更加方便。 在異步處理上,async 函數(shù)就是 Generator 函數(shù)的語(yǔ)法糖。 ...
摘要:以及異步代碼在中是特別常見(jiàn)的,我們?cè)撛趺醋霾疟容^無(wú)法捕獲的情況這段代碼中,的回調(diào)函數(shù)拋出一個(gè)錯(cuò)誤,并不會(huì)在中捕獲,會(huì)導(dǎo)致程序直接報(bào)錯(cuò)崩掉。用捕獲異步錯(cuò)誤把異步操作用包裝,通過(guò)內(nèi)部判斷,把錯(cuò)誤,在外面通過(guò)捕獲。 引入 我們都知道 try catch 無(wú)法捕獲 setTimeout 異步任務(wù)中的錯(cuò)誤,那其中的原因是什么。以及異步代碼在 js 中是特別常見(jiàn)的,我們?cè)撛趺醋霾疟容^? 無(wú)法捕獲的...
閱讀 3823·2021-11-24 09:39
閱讀 1827·2021-11-02 14:41
閱讀 829·2019-08-30 15:53
閱讀 3490·2019-08-29 12:43
閱讀 1204·2019-08-29 12:31
閱讀 3097·2019-08-26 13:50
閱讀 804·2019-08-26 13:45
閱讀 996·2019-08-26 10:56