成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術(shù)文章
文章詳情頁

JS異步代碼單元測試之神奇的Promise

瀏覽:163日期:2024-03-27 15:02:46
前言

寫這篇文章的起因是在寫單元測試時(shí),做形如下測試時(shí)

new Promise((resolve, reject) => reject(1)).then().catch(err => { console.log(err)})async function jestTest () { await Promise.resolve().then() console.log(’這個(gè)時(shí)候catch預(yù)期已經(jīng)被調(diào)用,且輸出日志’)}jestTest()

無法使用await將測試代碼恰好阻塞到catch在Event Loop中被調(diào)用后的時(shí)機(jī),從而檢測到catch的執(zhí)行,通過測試。

而使用“神奇”一詞則是因?yàn)?promsie 的鏈?zhǔn)秸{(diào)用中確實(shí)有很多默認(rèn)的 handler 和值的隱含傳遞。

promise 的鏈?zhǔn)秸{(diào)用

為了不浪費(fèi)大家的時(shí)間,我們先看一個(gè)例子:

Promise.resolve(’promise1’).then(res => { console.log(’promise1-1 then’)}).then(res => { console.log(’promise1-2 then’)}).then(res => { console.log(’promise1-3 then’)}).then(res => { console.log(’promise1-4 then’)})Promise.resolve(’promise2’).then(res => { console.log(’promise2-1 then’) throw new Error(’mock error 1’)}).then(res => { console.log(’promise2-2 then’) throw new Error(’mock error 2’)}).catch(err => { console.log(err)})

如果你答出的上述代碼的輸出順序與下述相同,那么你可以跳過這篇文章:

promise1-1 then

promise2-1 then

promise1-2 then

promise1-3 then

Error: mock error 1

promise1-4 then

首先有一個(gè)前提,就是你已經(jīng)知道了,這兩個(gè) promise 的 then 的調(diào)用是交叉入棧的(從頭三行輸出也能看出來),如果不清楚這部分內(nèi)容,可以查閱 Event Loop 的相關(guān)文章,同時(shí)需要注意的是,在文章所指明的版本中 Chrome 與 NodejsEvent Loop 機(jī)制已經(jīng)相同。

MDN 的錯(cuò)誤

我們?nèi)シ喯略荆ㄎ易隽诵薷模?MDN 關(guān)于 catch 的一段描述:

Basically, a promise chain stops if there’s an exception, looking down the chain for catch handlers instead.

鏈?zhǔn)秸{(diào)用在發(fā)生異常時(shí)會(huì)停止,在鏈上查找 catch 語句來執(zhí)行。

我最初的誤解與此相同,誤以為 catch 會(huì)直接抓到第一個(gè)throw Error,即Error會(huì)在promise1-2之后輸出,即promise2-2所在的then并不會(huì)被加入調(diào)用棧。

而通過觀察實(shí)際的輸出結(jié)果發(fā)現(xiàn)并非如此,那么可以說明 MDN 解釋的字面意思應(yīng)該是錯(cuò)的,鏈?zhǔn)秸{(diào)用并沒有停止,而是執(zhí)行了我們沒看到的東西。

鏈?zhǔn)降哪J(rèn)處理

這時(shí)我們需要知道then的一個(gè)默認(rèn)處理,同樣直接引用 MDN 的描述:

If the Promise that then is called on adopts a state (fulfillment or rejection) for which then has no handler, a new Promise is created with no additional handlers, simply adopting the final state of the original Promise on which then was called.

如果你的 promise 的 then 缺少了對應(yīng)狀態(tài)處理的回調(diào),那么 then 會(huì)自動(dòng)生成一個(gè)接受此 promise 狀態(tài)的 promise,即 then 會(huì)返回一個(gè)狀態(tài)引用相同的 promsie,交給后續(xù)的調(diào)用。

那么上述代碼中的第二個(gè) promise 部分就等效于

Promise.resolve(’promise2’).then(res => { console.log(’promise2-1 then’) throw new Error(’mock error 1’)}).then(res => { console.log(’promise2-2 then’) throw new Error(’mock error 2’)// 注意這個(gè) onRejected}, (err) => { return Promise.reject(err)}).catch(err => { console.log(err)})

也就是說在輸出結(jié)果的promise1-2和promise1-3之間是執(zhí)行了promise2-2所在的then的,也就是說鏈?zhǔn)秸{(diào)用并沒有直接停止,promise2-2所在的then還是被加入了調(diào)用棧。而catch并不是直接catch的第一個(gè)then拋出的錯(cuò)誤,而是這個(gè)隱藏的onRejected返回的同樣狀態(tài)的promise。

簡寫

同理我們需要知道的是,catch(onRejected)是then(undefined, onRejected)的簡寫,即就算調(diào)用鏈的前置調(diào)用沒有發(fā)生錯(cuò)誤,catch也是會(huì)進(jìn)入調(diào)用棧而非直接跳過的。

Promise.resolve(’promise1’).then(res => { console.log(’promise1-1 then’)}).then(res => { console.log(’promise1-2 then’)}).then(res => { console.log(’promise1-3 then’)})Promise.resolve(’promise2’).then(res => { console.log(’promise2-1 then’)}).catch(err => { console.log(err)}).then(res => { console.log(’其實(shí)我是 promise2-3 then’)})async await

首先需要注意的是在文章指明的 NodeJs 和 Chrome 版本中,f(await promise)完全等同于promise.then(f)。

當(dāng)然,討論promise的時(shí)候,我們也不能拋開async await。雖然兩者在 promise 狀態(tài)為 onResolve 時(shí)處理邏輯相同,但錯(cuò)誤處理的執(zhí)行邏輯并不一樣,在async await中發(fā)生錯(cuò)誤時(shí),才是真正的直接跳過后續(xù)await的執(zhí)行

const promiseReject = new Promise((resolve, reject) => { reject(new Error(’錯(cuò)誤’))})const promiseResolve1 = new Promise((resolve, reject) => { resolve(’正確’)})const promiseResolve2 = new Promise((resolve, reject) => { resolve(’正確’)})const promiseResolve3 = new Promise((resolve, reject) => { resolve(’正確’)})function demo1 () { promiseReject .then(() => {console.log(’1-1’) }) .catch(err => {console.log(’1-2’) })}async function demo2 () { try {await promiseRejectawait promiseResolve1await promiseResolve2await promiseResolve3 } catch (error) {console.log(’2-1’) }}// 2-1// 1-2

以上就是JS異步代碼單元測試之神奇的Promise的詳細(xì)內(nèi)容,更多關(guān)于JS異步代碼之Promise的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: JavaScript
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
91久久久久| 精品视频在线看| 在线国产电影不卡| 自拍偷在线精品自拍偷无码专区| 91美女片黄在线观看| 日韩午夜精品视频| 国产资源在线一区| 欧美性极品少妇| 青青草国产精品97视觉盛宴 | 99精品热视频| 26uuu另类欧美| 国产麻豆欧美日韩一区| 91精品综合久久久久久| 国产一区二区福利视频| 欧美日韩国产成人在线91| 日本不卡视频在线| 欧美亚洲图片小说| 久久国产乱子精品免费女| 久久亚洲视频| 日韩av不卡在线观看| 在线观看视频一区二区| 久久国产精品第一页| 欧美日韩在线电影| 国产大陆a不卡| 91精品国产综合久久久蜜臀粉嫩| 国产在线播放一区二区三区| 欧美日韩精品是欧美日韩精品| 捆绑紧缚一区二区三区视频| 欧美三级蜜桃2在线观看| 国内外成人在线| 欧美一级xxx| av一区二区三区| 中文字幕不卡在线播放| 亚洲国产美女| 午夜精品一区二区三区免费视频 | 欧美日韩视频| 日韩毛片一二三区| 亚洲一区高清| 日本中文字幕一区二区有限公司| 欧美日韩久久久| 国产精品亚洲第一| 26uuu久久综合| 国产一区久久| 一区二区三区中文字幕| 久久国产一二区| 久久99精品一区二区三区三区| 欧美电影精品一区二区| 欧美三级特黄| 亚洲成人av资源| 欧美日韩在线播放一区| va亚洲va日韩不卡在线观看| 欧美经典一区二区| 亚洲最黄网站| 婷婷丁香激情综合| 在线播放欧美女士性生活| 不卡av在线免费观看| 国产精品第一页第二页第三页| 亚洲免费婷婷| 国产成人av网站| 中文字幕一区不卡| 免费亚洲一区| 国产一区二区91| 欧美激情资源网| 久久久精品午夜少妇| 国产一区二区三区四区五区入口| 2020国产精品| 国产精品色网| 国产一区二区不卡| 国产精品欧美经典| 久久综合九色| 成人高清av在线| 伊人一区二区三区| 欧美丰满少妇xxxxx高潮对白| 欧美精品麻豆| 日本欧美一区二区在线观看| 日韩一区二区麻豆国产| 亚洲视频碰碰| 日韩av成人高清| 国产亚洲精品aa| 久久国产一区| caoporen国产精品视频| 亚洲综合久久av| 91麻豆精品国产无毒不卡在线观看| av不卡在线播放| 亚洲一区二区欧美| 精品三级av在线| 亚洲一区一卡| 国产69精品一区二区亚洲孕妇| 最好看的中文字幕久久| 这里只有精品99re| 亚洲丰满在线| 国产精品18久久久久| 亚洲欧美日韩国产中文在线| 这里只有精品99re| 一区二区精品| 国产v日产∨综合v精品视频| 亚洲精选视频在线| 日韩一区二区三区观看| 亚洲精品四区| 国产中文字幕精品| 一区二区三区在线免费观看| 日韩精品中午字幕| 欧美亚洲免费| 欧美大片专区| 激情偷乱视频一区二区三区| 国产精品乱人伦一区二区| 欧美日韩三级一区二区| 亚洲高清123| 国产成人精品www牛牛影视| 亚洲成人午夜电影| 欧美国产综合色视频| 欧美午夜精品理论片a级按摩| 在线成人亚洲| 成人午夜激情片| 亚洲成av人影院在线观看网| 国产日韩欧美综合在线| 欧美日韩夫妻久久| 亚洲精品一区二区三区av| 国产成人综合精品三级| 亚洲18女电影在线观看| 中文字幕欧美三区| 欧美一区二区三区免费| 午夜在线视频观看日韩17c| 91蜜桃在线免费视频| 国产一区二三区| 亚洲成av人影院| 日韩美女精品在线| 久久久久国产精品麻豆ai换脸| 欧美视频一区二区| 国产日韩欧美| 欧美在线二区| 国产电影精品久久禁18| 日韩 欧美一区二区三区| 中文字幕一区在线观看视频| 欧美电影免费提供在线观看| 精品视频一区二区三区免费| 欧美资源在线| 亚洲国产一区二区三区在线播| 成人美女视频在线看| 久久91精品久久久久久秒播| 亚洲风情在线资源站| 国产精品女人毛片| 欧美精品一区二区三区一线天视频| 欧美日韩国产免费一区二区| 欧美一级一区| 国内精品久久久久久久果冻传媒| www.亚洲激情.com| 国产精品夜夜爽| 久99久精品视频免费观看| 婷婷久久综合九色综合伊人色| 悠悠色在线精品| 亚洲三级久久久| 中文字幕一区在线观看| 日本一区二区免费在线观看视频| 欧美精品一区二区高清在线观看 | 国产精品久久久久影院| 久久久美女毛片| 日韩小视频在线观看专区| 欧美视频第二页| 在线观看网站黄不卡| 免费久久久一本精品久久区| 最新成人av网站| 亚洲图色在线| 狠狠色综合网| 国产精品大片免费观看| 欧美一区二区在线| 色综合网色综合| 91免费观看在线| 91网站最新网址| 欧美在线首页| 91在线国产观看| 97精品超碰一区二区三区| youjizz国产精品| 99在线精品免费| 色综合久久综合中文综合网| 午夜国产精品视频| 国产一区二区三区四区老人| 黄色一区二区三区四区| 在线欧美一区| 亚洲一区三区视频在线观看 | 国产一区再线| 一色屋精品视频在线看| 亚洲欧洲综合| 国产偷久久久精品专区| 亚洲免费网站| 久久免费国产| 色哦色哦哦色天天综合| 欧美在线短视频| 5566中文字幕一区二区电影| 欧美成va人片在线观看| 精品久久一区二区| 国产亚洲精久久久久久| 国产精品国产三级国产有无不卡| 亚洲素人一区二区| 一区二区在线免费| 五月综合激情网| 激情综合色播激情啊| 高清在线成人网| 99国产欧美另类久久久精品 | 另类人妖一区二区av|