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

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

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

瀏覽:205日期: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久久,三上悠亚国产精品一区二区三区
日韩精品1区2区3区| 国产精品美女在线观看直播| 成人美女视频| 日韩精品一页| 午夜在线视频观看日韩17c| 国产亚洲亚洲| 麻豆精品视频在线观看免费| 国产精品不卡| 日韩精品dvd| 国语对白精品一区二区| 岛国av在线网站| 欧美精品不卡| 91福利精品在线观看| 水蜜桃精品av一区二区| 久久精品二区亚洲w码| 热三久草你在线| 日韩精品一卡二卡三卡四卡无卡| 另类激情亚洲| 精品国产黄a∨片高清在线| 亚洲a级精品| 九九精品调教| 国产精品毛片| 国产美女视频一区二区| 成人自拍av| 亚洲精选91| 日韩国产欧美三级| 999久久久91| 久草精品视频| 日韩二区在线观看| 日韩欧美精品一区| 日本a级不卡| 四虎4545www国产精品| 国产精品久久久久久久久久妞妞| 国产一区二区精品福利地址| 欧美亚洲国产激情| 久久99精品久久久野外观看| 老鸭窝一区二区久久精品| 三上亚洲一区二区| 欧美丝袜一区| 日韩 欧美一区二区三区| 欧美一区不卡| 亚洲伦乱视频| 亚洲一区二区三区四区电影 | 尹人成人综合网| 一区久久精品| 日精品一区二区三区| 欧美在线首页| 国产一区二区三区亚洲综合| 日韩av不卡在线观看| 在线一区电影| 中文字幕一区二区三区在线视频| 黄色成人精品网站| 一区二区电影在线观看| 亚洲精品在线影院| 国产成人久久精品麻豆二区 | 男女激情视频一区| 国产 日韩 欧美一区| 欧美影院视频| 欧美日韩va| 麻豆传媒一区二区三区| 精品丝袜久久| 久久免费精品| 日本精品不卡| 亚洲www啪成人一区二区| 激情久久中文字幕| 欧美日韩国产亚洲一区| 黄色日韩在线| 欧美日韩视频免费看| 久久只有精品| 先锋影音国产一区| 欧美日韩99| 国产综合亚洲精品一区二| 一区二区精品| 国产综合视频| 激情综合婷婷| 欧美精品91| 日韩精品一区二区三区av| 99视频一区| 视频一区二区三区入口| 国产精品男女| 日韩视频在线一区二区三区 | 亚洲精品无播放器在线播放| 999国产精品永久免费视频app| 免费视频一区二区三区在线观看| 国产综合色产| 国产精品hd| 国产精品成人自拍| 国产乱码精品一区二区三区四区| 免费在线亚洲| 欧美成a人片免费观看久久五月天| 国产盗摄——sm在线视频| 9国产精品视频| 日韩伦理在线一区| 国产欧美久久一区二区三区| 视频一区二区三区中文字幕| 欧美xxxx中国| 日本欧美一区| 国产亚洲精aa在线看 | 欧美日韩调教| 亚洲欧美日本国产| 中文无码日韩欧| 日本强好片久久久久久aaa| 麻豆91精品91久久久的内涵| 午夜av一区| 亚洲a级精品| 亚洲区国产区| 国产一区二区三区四区五区| 日韩不卡一区二区三区| 久久成人高清| 欧美日韩99| 国产精品一区毛片| 热久久国产精品| 欧美大黑bbbbbbbbb在线| 国产美女久久| 日本不卡视频在线观看| 人人精品人人爱| 激情91久久| 亚洲日本国产| 免费在线观看一区| 久久精品一区二区不卡| 亚洲综合电影一区二区三区| 免费欧美在线视频| 国产精品久久久久久久久久妞妞 | 国产精品久久久网站| 日韩国产精品久久久久久亚洲| 亚洲无线观看| 国产色播av在线| av资源亚洲| 国产综合婷婷| 日日摸夜夜添夜夜添国产精品| 国产日韩三级| 欧美a级一区| 青青草伊人久久| 日本少妇一区| 91欧美极品| 香蕉视频亚洲一级| 国产精品va| 少妇精品久久久一区二区三区| 日韩一区二区三区四区五区| 色乱码一区二区三区网站| 三级精品视频| 999久久久免费精品国产| 久久毛片亚洲| 午夜精品免费| 久久一区精品| 国产模特精品视频久久久久| 久久国产免费看| 黑丝一区二区三区| 欧美精品二区| 日韩欧美四区| 久久亚洲风情| 夜夜嗨网站十八久久| 欧美国产日本| 久久精品 人人爱| 欧美一区91| 婷婷成人av| 国产精品普通话对白| 国产精品高颜值在线观看| 欧美影院视频| 亚洲国产不卡| 日韩在线精品| 国产欧美在线观看免费| 国产日韩欧美一区二区三区在线观看 | 日韩理论片av| 日韩视频不卡| 精精国产xxxx视频在线播放| 欧美亚洲三级| 亚洲欧美日韩高清在线| 久久在线电影| 午夜久久黄色| 免费精品视频在线| 日韩精品久久理论片| 亚洲一区二区三区免费在线观看| 欧美aa在线观看| 92国产精品| 欧美福利一区| 亚洲免费中文| 亚洲在线免费| 丝袜亚洲另类欧美| 国产精品毛片aⅴ一区二区三区| 日韩中文字幕91| 亚洲精品日韩久久| 免费成人av在线播放| 麻豆亚洲精品| 91伊人久久| 六月婷婷一区| 亚洲激情二区| 狠狠久久伊人中文字幕| 成人日韩精品| 亚洲一区二区三区久久久| 国产一区二区三区精品在线观看| 91亚洲人成网污www| 日韩精品永久网址| 久久电影tv| 欧美日韩精品免费观看视完整| 日韩欧美中文| 亚洲激情不卡| 欧美日韩精品一区二区三区视频 | 久久www成人_看片免费不卡| 蜜臀av免费一区二区三区|