摘要:的執(zhí)行與狀態(tài)無關(guān)當(dāng)?shù)玫綘顟B(tài)不論成功或失敗后就會(huì)執(zhí)行,原文鏈接參考鏈接對象
同期異步系列文章推薦
談一談javascript異步
javascript異步中的回調(diào)
javascript異步與promise
javascript異步之Promise.resolve()、Promise.reject()
javascript異步之Promise then和catch
javascript異步之a(chǎn)sync(一)
javascript異步之a(chǎn)sync(二)
javascript異步實(shí)戰(zhàn)
javascript異步總結(jié)歸檔
今天我們繼續(xù)討論promise
網(wǎng)絡(luò)上關(guān)于PromiseAPI使用的文章多如牛毛,為了保持javascript異步系列文章的完整性,現(xiàn)在對promise的API進(jìn)行簡單全面的介紹
我在easy-mock添加了三個(gè)接口,備用
依然使用axios進(jìn)行ajax請求
Promise.all()有點(diǎn)像“并行”
我們看一個(gè)栗子
promise
我們知道axios返回的是一個(gè)promise對象,我們可以看下
console.log(p1);
Promise.all就是用于將多個(gè) Promise 實(shí)例,包裝成一個(gè)新的 Promise 實(shí)例
Promise.all,接收一個(gè)數(shù)組作為參數(shù),數(shù)組的每一項(xiàng)都返回Promise實(shí)例
我們重點(diǎn)看這段代碼
const p = Promise.all([p3, p1, p2]) .then(arr => { console.log(arr); console.log("Promise.all成功啦"); }) .catch(err=>{ console.log(err,"Promise.all錯(cuò)啦"); })
p1,p2,p3都是返回promise實(shí)例,Promise.all不關(guān)心他們的執(zhí)行順序,如果他們都返回成功的狀態(tài),Promise.all則返回成功的狀態(tài),輸出一個(gè)數(shù)組,是這三個(gè)p1,p2,p3的返回值,數(shù)組的順序和他們的執(zhí)行順序無關(guān),和他們作為參數(shù)排列的順序有關(guān)
我們看下輸出
為了是拉長接口三的返回時(shí)間我對接口三的數(shù)據(jù)進(jìn)行了修改,返回值是長度1000-2000之間的隨機(jī)數(shù)組,所以p3的執(zhí)行要晚于p1和p2,
但我們輸出的arr,p3依然在前面,這給我們帶來一個(gè)便利,返回值數(shù)組的順序和方法的執(zhí)行順序無關(guān),可以進(jìn)行人為進(jìn)行控制
我們將p1做一下改動(dòng),使p1報(bào)錯(cuò)
const p1 = axios.get("https://easy-mock.com/mock/5b0525349ae34e7a89352191/example/promise1") .then(({ data }) => { console.log("p1成功啦"); return xxxx.data//將data.data修改為xxxx.data })
如果有一個(gè)返回失?。╮eject),Promise.all則返回失?。╮eject)的狀態(tài),此時(shí)第一個(gè)被reject的實(shí)例的返回值,會(huì)傳遞給P的回調(diào)函數(shù)。
三個(gè)promise實(shí)例參數(shù)之間是“與”的關(guān)系,全部成功,Promise.all就返回成功,有一個(gè)失敗,Promise.all就返回失敗
換個(gè)角度說,一個(gè)promise的執(zhí)行結(jié)果依賴于另外幾個(gè)promise的執(zhí)行結(jié)果,
例如:
幾個(gè)ajax全部執(zhí)行完了,才能渲染頁面,
幾個(gè)ajax全部執(zhí)行完了,才能做一些數(shù)據(jù)的計(jì)算操作,
不關(guān)心執(zhí)行順序,只關(guān)心集體的執(zhí)行結(jié)果
Promise中的競態(tài),用法和Promise.all類似,對應(yīng)參數(shù)的要求和Promise.all相同,傳入一個(gè)數(shù)組作為參數(shù),參數(shù)要返回一個(gè)Promise實(shí)例
race就是競爭的意思,數(shù)組內(nèi)的Promise實(shí)例,誰執(zhí)行的快,就返回誰的執(zhí)行結(jié)果,不管是成功還是失敗
const p = Promise.race([p3, p1, p2]) .then(res => { console.log(res); console.log("Promise.all成功啦"); }) .catch(err=>{ console.log(err,"Promise.all錯(cuò)啦"); })
通過輸出我們發(fā)現(xiàn)
p1是第一個(gè)完成的,所以p的返回結(jié)果就是p1的執(zhí)行結(jié)果
而且就算完成,但是 進(jìn)程不會(huì)立即停止,還會(huì)繼續(xù)執(zhí)行下去。
搜了一下,很多文章都說是用來解決網(wǎng)絡(luò)超時(shí)的提示,類似于下面這樣
const p3 = axios.get("https://easy-mock.com/mock/5b0525349ae34e7a89352191/example/mock") .then(({ data }) => { console.log("p3成功啦"); return data.data }) const p4 = new Promise(function (resolve, reject) { setTimeout(() => reject(new Error("網(wǎng)絡(luò)連接超時(shí)")), 50) }) const p = Promise.race([p3, p4]) .then(res => console.log(res)) .catch(err => console.log(err));
p3的ajax和50ms的定時(shí)器比較,看誰執(zhí)行的快,如果超過了50ms,p3的ajax還沒返回,就告知用戶網(wǎng)絡(luò)連接超時(shí)
這里有個(gè)問題,就算提示超時(shí)了,p3還在繼續(xù)執(zhí)行,它并沒有停下來,直到有狀態(tài)返回
個(gè)人觀點(diǎn):race可以用來為ajax請求的時(shí)長劃定范圍,如果ajax請求時(shí)長超過xxxms會(huì)執(zhí)行某個(gè)方法,或者ajax請求時(shí)長不超過xxms會(huì)執(zhí)行某個(gè)方法,總之,race的應(yīng)用空間不是很大
finally方法用于指定不管 Promise 對象最后狀態(tài)如何,都會(huì)執(zhí)行的操作。該方法是 ES2018 引入標(biāo)準(zhǔn)的。
const p = Promise.race([p3, p4]) .then(res => console.log(res)) .catch(err => console.log(err)) .finally(() => { console.log("finally的執(zhí)行與狀態(tài)無關(guān)") });
當(dāng)promise得到狀態(tài)(不論成功或失?。┖缶蜁?huì)執(zhí)行finally,
原文鏈接
參考鏈接
Promise 對象
Promise.prototype.finally
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/101288.html
摘要:前言異步編程模式在前端開發(fā)過程中,顯得越來越重要。隨著新標(biāo)準(zhǔn)的到來,處理異步數(shù)據(jù)流又有了新的方案。接下來我們介紹這兩種處理異步編程的方案。仍在繼續(xù)執(zhí)行,但執(zhí)行結(jié)果將被丟棄。使得異步代碼看起來像同步代碼,再也沒有回調(diào)函數(shù)。 前言 異步編程模式在前端開發(fā)過程中,顯得越來越重要。從最開始的XHR到封裝后的Ajax都在試圖解決異步編程過程中的問題。隨著ES6新標(biāo)準(zhǔn)的到來,處理異步數(shù)據(jù)流又有了新...
摘要:前言異步編程模式在前端開發(fā)過程中,顯得越來越重要。隨著新標(biāo)準(zhǔn)的到來,處理異步數(shù)據(jù)流又有了新的方案。接下來我們介紹這兩種處理異步編程的方案。仍在繼續(xù)執(zhí)行,但執(zhí)行結(jié)果將被丟棄。使得異步代碼看起來像同步代碼,再也沒有回調(diào)函數(shù)。 前言 異步編程模式在前端開發(fā)過程中,顯得越來越重要。從最開始的XHR到封裝后的Ajax都在試圖解決異步編程過程中的問題。隨著ES6新標(biāo)準(zhǔn)的到來,處理異步數(shù)據(jù)流又有了新...
摘要:前言異步編程模式在前端開發(fā)過程中,顯得越來越重要。隨著新標(biāo)準(zhǔn)的到來,處理異步數(shù)據(jù)流又有了新的方案。接下來我們介紹這兩種處理異步編程的方案。仍在繼續(xù)執(zhí)行,但執(zhí)行結(jié)果將被丟棄。使得異步代碼看起來像同步代碼,再也沒有回調(diào)函數(shù)。 前言 異步編程模式在前端開發(fā)過程中,顯得越來越重要。從最開始的XHR到封裝后的Ajax都在試圖解決異步編程過程中的問題。隨著ES6新標(biāo)準(zhǔn)的到來,處理異步數(shù)據(jù)流又有了新...
摘要:前言對于這門語言,其實(shí)我更喜歡稱它為,從一開始我們就已經(jīng)涉及到異步編程,但是多數(shù)開發(fā)者從來沒有認(rèn)真思考過自己程序中的異步,到底是怎么實(shí)現(xiàn)的,以及為什么會(huì)出現(xiàn)。 前言 對于JavaScript這門語言,其實(shí)我更喜歡稱它為ECMAScript,從一開始我們就已經(jīng)涉及到異步編程,但是多數(shù)JavaScript開發(fā)者從來沒有認(rèn)真思考過自己程序中的異步,到底是怎么實(shí)現(xiàn)的,以及為什么會(huì)出現(xiàn)。但是由于...
摘要:入門之基本用法背景在我們使用異步函數(shù)比如進(jìn)行編寫代碼,如果我們需要很多個(gè)請求不同的接口,而下一個(gè)接口需要依賴上一個(gè)接口的返回值,這樣,我們的代碼則需要在各種回調(diào)函數(shù)中嵌套,這樣一層一層地下去,就形成了回調(diào)地獄。 Promise入門之基本用法 背景 在我們使用異步函數(shù)比如ajax進(jìn)行編寫代碼,如果我們需要很多個(gè)ajax請求不同的接口,而下一個(gè)接口需要依賴上一個(gè)接口的返回值,這樣,我們的代...
閱讀 4009·2023-04-26 02:13
閱讀 2252·2021-11-08 13:13
閱讀 2740·2021-10-11 10:59
閱讀 1740·2021-09-03 00:23
閱讀 1311·2019-08-30 15:53
閱讀 2287·2019-08-28 18:22
閱讀 3059·2019-08-26 10:45
閱讀 737·2019-08-23 17:58