日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

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

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

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

new Promise((resolve, reject) => reject(1)).then().catch(err => { console.log(err)})async function jestTest () { await Promise.resolve().then() console.log(’這個時候catch預期已經被調用,且輸出日志’)}jestTest()

無法使用await將測試代碼恰好阻塞到catch在Event Loop中被調用后的時機,從而檢測到catch的執行,通過測試。

而使用“神奇”一詞則是因為 promsie 的鏈式調用中確實有很多默認的 handler 和值的隱含傳遞。

promise 的鏈式調用

為了不浪費大家的時間,我們先看一個例子:

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

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

MDN 的錯誤

我們去翻閱下原本(我做了修改) MDN 關于 catch 的一段描述:

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

鏈式調用在發生異常時會停止,在鏈上查找 catch 語句來執行。

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

而通過觀察實際的輸出結果發現并非如此,那么可以說明 MDN 解釋的字面意思應該是錯的,鏈式調用并沒有停止,而是執行了我們沒看到的東西。

鏈式的默認處理

這時我們需要知道then的一個默認處理,同樣直接引用 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 缺少了對應狀態處理的回調,那么 then 會自動生成一個接受此 promise 狀態的 promise,即 then 會返回一個狀態引用相同的 promsie,交給后續的調用。

那么上述代碼中的第二個 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’)// 注意這個 onRejected}, (err) => { return Promise.reject(err)}).catch(err => { console.log(err)})

也就是說在輸出結果的promise1-2和promise1-3之間是執行了promise2-2所在的then的,也就是說鏈式調用并沒有直接停止,promise2-2所在的then還是被加入了調用棧。而catch并不是直接catch的第一個then拋出的錯誤,而是這個隱藏的onRejected返回的同樣狀態的promise。

簡寫

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

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(’其實我是 promise2-3 then’)})async await

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

當然,討論promise的時候,我們也不能拋開async await。雖然兩者在 promise 狀態為 onResolve 時處理邏輯相同,但錯誤處理的執行邏輯并不一樣,在async await中發生錯誤時,才是真正的直接跳過后續await的執行

const promiseReject = new Promise((resolve, reject) => { reject(new Error(’錯誤’))})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的詳細內容,更多關于JS異步代碼之Promise的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日本免费一区二区视频| 国产日韩欧美| 国产精品一区二区免费福利视频| 欧美日韩精品一本二本三本 | 欧美精选一区二区三区| 午夜欧美巨大性欧美巨大| 国产精品亚洲欧美日韩一区在线 | 欧美日韩国产一区二区在线观看| 欧美久久精品| 黄色aa久久| 久久久久久久久丰满| 99pao成人国产永久免费视频| 日韩动漫一区| 粉嫩av一区二区三区四区五区| 婷婷激情一区| 91国内精品| 日韩高清不卡| 久久激情五月婷婷| 国产99久久| 国产精品黄网站| 日韩视频久久| 精品理论电影在线| 亚洲一区二区三区免费在线观看| 欧美日韩a区| 亚洲电影在线| 日本欧美一区| 欧美日韩国产探花| 精品国产99| 日韩av影院| 黄色精品网站| 天堂√8在线中文| 911亚洲精品| 老牛影视一区二区三区| 丝袜美腿一区| 精品女同一区二区三区在线观看| 在线一区二区三区视频| 成人看片网站| 国产一区二区三区黄网站| 久久不射网站| 日本高清不卡一区二区三区视频| 国产亚洲欧美日韩精品一区二区三区 | 日韩精品诱惑一区?区三区| 日本高清久久| 日本不卡一区二区| 亚洲伊人精品酒店| 蜜桃av一区| 免费精品视频| 国产麻豆综合| 丝袜亚洲精品中文字幕一区| 亚洲精品小说| 久久国产88| 欧美福利一区| 欧美中文日韩| 老牛影视一区二区三区| 91精品啪在线观看国产爱臀| 精品视频网站| 亚洲欧美日本国产专区一区| 欧美aⅴ一区二区三区视频| 国产 日韩 欧美一区| 视频一区中文字幕| 精品三区视频| 日日夜夜免费精品| 亚洲精品网址| 国内精品伊人| 91九色精品| 蜜臀精品久久久久久蜜臀| 美日韩精品视频| 美女在线视频一区| 久久99影视| 久久精选视频| 欧美日韩午夜电影网| 日韩成人精品一区| 亚洲黑丝一区二区| 无码日韩精品一区二区免费| 麻豆国产欧美日韩综合精品二区| 精品少妇一区| 亚洲欧美日韩精品一区二区 | 在线看片国产福利你懂的| 久久要要av| 欧美亚洲国产日韩| 麻豆国产精品777777在线| 日本а中文在线天堂| 久久亚洲色图| 国产一区二区精品久| 国产亚洲永久域名| 欧美黑人巨大videos精品| 亚洲成人三区| 国产精品s色| 午夜一级在线看亚洲| 麻豆精品新av中文字幕| 亚洲激情精品| 免费在线成人| 天堂俺去俺来也www久久婷婷| 久久久精品久久久久久96 | 国内精品福利| 麻豆国产精品| 日本不卡视频在线观看| 91精品一区二区三区综合| 国产亚洲电影| 亚州欧美在线| 欧美在线网站| 久久国产小视频| 伊人久久视频| 国产精品香蕉| 国产极品一区| 欧美在线看片| 91成人小视频| 三级一区在线视频先锋| 亚洲国产专区| 精品国产网站| 精品国内亚洲2022精品成人| 国产精品日本一区二区不卡视频 | 日韩中文一区二区| 丝袜美腿一区二区三区| 免费国产亚洲视频| 亚洲精选av| 日本成人在线视频网站| 亚洲影视一区二区三区| 国产一区导航| 精品91久久久久| 蜜臀久久99精品久久久久宅男 | 视频一区欧美精品| 夜夜嗨av一区二区三区网站四季av| 午夜视频精品| 亚洲区第一页| 欧美亚洲tv| 国产精品成人自拍| 国产一区二区色噜噜| 加勒比视频一区| 日本综合字幕| 亚洲视频播放| 美女久久久久| 美美哒免费高清在线观看视频一区二区| 日韩专区一卡二卡| 国产乱人伦精品一区| 成人三级高清视频在线看| 欧美午夜精彩| 午夜天堂精品久久久久| 精品一区二区三区中文字幕| 九九色在线视频| 久久午夜视频| 精品午夜av| 欧美精品一区二区久久| 日韩国产一二三区| 国产91在线精品| 日本欧美在线看| 91精品啪在线观看国产爱臀| 久久久久99| 国产精品麻豆成人av电影艾秋| 亚洲欧美一区在线| 日本成人手机在线| 蜜臀久久精品| 91亚洲无吗| 亚洲综合丁香| 国产精品成人一区二区不卡| 蜜臀久久99精品久久久久宅男| 麻豆一区在线| 麻豆久久精品| 欧美在线影院| 91精品xxx在线观看| 国产精品地址| 伊人久久大香线蕉av不卡| 国产精品久久久网站| 亚洲欧美久久| 精品欧美久久| 色网在线免费观看| 精品国产亚洲一区二区三区大结局| 亚洲三级精品| 国产日韩专区| 国产亚洲在线| 亚洲免费中文| 五月天久久网站| 国产99久久| 亚洲黑丝一区二区| 欧美一区三区| 国产专区一区| 亚洲永久av| 久久激情婷婷| 日韩一区二区三区免费播放| 成人国产精品一区二区免费麻豆| 青青草国产精品亚洲专区无| 亚洲免费福利一区| 另类av一区二区| 亚洲美洲欧洲综合国产一区 | 欧美好骚综合网| 久久毛片亚洲| 91精品亚洲| 免费在线观看一区二区三区| 久热精品在线| 日本不卡高清| 男人操女人的视频在线观看欧美| 欧美.日韩.国产.一区.二区| 99在线观看免费视频精品观看| 中文日韩欧美| 久久电影一区| 亚洲欧美日韩视频二区| 日韩一级精品| 日本一区二区三区视频在线看| 亚洲aⅴ网站| 日韩欧美高清一区二区三区|