Javascript?promise.all的用法介紹(簡(jiǎn)潔易懂)
前言
Promise對(duì)象的狀態(tài)改變,只有兩種可能:從pending變?yōu)閒ulfilled和從pending變?yōu)閞ejected。只要這兩種情況發(fā)生,狀態(tài)就凝固了,不會(huì)再變了,會(huì)一直保持這個(gè)結(jié)果,這時(shí)就稱為 resolved(已定型)。如果改變已經(jīng)發(fā)生了,你再對(duì)Promise對(duì)象添加回調(diào)函數(shù),也會(huì)立即得到這個(gè)結(jié)果。這與事件(Event)完全不同,事件的特點(diǎn)是,如果你錯(cuò)過了它,再去監(jiān)聽,是得不到結(jié)果的。
promise.all()該方法用于將多個(gè)Promise實(shí)例,包裝成一個(gè)新的Promise實(shí)例。
var p=Promise.all([p1,p2,p3]);
(1)只有p1、p2、p3的狀態(tài)都變成fulfilled,p的狀態(tài)才會(huì)變成fulfilled,此時(shí)p1、p2、p3的返回值組成一個(gè)數(shù)組,傳遞給p的回調(diào)函數(shù)。
(2)只要p1、p2、p3之中有一個(gè)被rejected,p的狀態(tài)就變成rejected,此時(shí)第一個(gè)被reject的實(shí)例的返回值,會(huì)傳遞給p的回調(diào)函數(shù)。
promise.all()
比如當(dāng)數(shù)組里的P1,P2都執(zhí)行完成時(shí),頁面才顯示。 值得注意的是,返回的數(shù)組結(jié)果順序不會(huì)改變,即使P2的返回要比P1的返回快,順序依然是P1, P2
Promise.all成功返回成功數(shù)組,失敗返回失敗數(shù)據(jù),一但失敗就不會(huì)繼續(xù)往下走
let p1 = new Promise((resolve, reject) => { resolve('成功了') }) let p2 = new Promise((resolve, reject) => { resolve('success') }) let p3 = Promse.reject('失敗') Promise.all([p1, p2]).then((result) => { console.log(result) //['成功了', 'success'] }).catch((error) => { console.log(error) }) Promise.all([p1,p3,p2]).then((result) => { console.log(result) }).catch((error) => { console.log(error) // 失敗了,打出 '失敗' })
let wake = (time) => { return new Promise((resolve, reject) => { setTimeout(() => { resolve(`${time / 1000}秒后醒來`) }, time) }) } let p1 = wake(3000) let p2 = wake(2000) Promise.all([p1, p2]).then((result) => { console.log(result) // [ '3秒后醒來', '2秒后醒來' ] }).catch((error) => { console.log(error) }) 需要特別注意的是,Promise.all獲得的成功結(jié)果的數(shù)組里面的數(shù)據(jù)順序和 Promise.all接收到的數(shù)組順序是一致的,即p1的結(jié)果在前,即便p1的結(jié)果 獲取的比p2要晚。這帶來了一個(gè)絕大的好處:在前端開發(fā)請(qǐng)求數(shù)據(jù)的過程中, 偶爾會(huì)遇到發(fā)送多個(gè)請(qǐng)求并根據(jù)請(qǐng)求順序獲取和使用數(shù)據(jù)的場(chǎng)景, 使用Promise.all毫無疑問可以解決這個(gè)問題。
注意:如果作為參數(shù)的 Promise 實(shí)例,自己定義了catch方法,那么它一旦被rejected, 并不會(huì)觸發(fā)Promise.all()的catch方法。 示例代碼: const p1 = new Promise((resolve, reject) => { resolve('hello'); }) .then(result => result) .catch(e => e); const p2 = new Promise((resolve, reject) => { throw new Error('報(bào)錯(cuò)了'); }) .then(result => result) .catch(e => e); Promise.all([p1, p2]) .then(result => console.log(result)) .catch(e => console.log(e));// ["hello", Error: 報(bào)錯(cuò)了] p1會(huì)resolved,p2首先會(huì)rejected,但是p2有自己的catch方法,該方法返回的是一個(gè) 新的 Promise 實(shí)例,p2指向的實(shí)際上是這個(gè)實(shí)例。 該實(shí)例執(zhí)行完catch方法后,也會(huì)變成resolved,導(dǎo)致Promise.all()方法參數(shù)里面的兩個(gè)實(shí) 例都會(huì)resolved,因此會(huì)調(diào)用then方法指定的回調(diào)函數(shù),而不會(huì)調(diào)用catch方法指定的回調(diào)函數(shù)。 而如果p2沒有自己的catch方法,就會(huì)調(diào)用Promise.all()的catch方法。如下: const p1 = new Promise((resolve, reject) => { resolve('hello'); }) .then(result => result); const p2 = new Promise((resolve, reject) => { throw new Error('報(bào)錯(cuò)了'); }) .then(result => result); Promise.all([p1, p2]) .then(result => console.log(result)) .catch(e => console.log(e));// Error: 報(bào)錯(cuò)了
promise.race( )
Promise.race是賽跑的意思,也就是說Promise.race([p1, p2, p3])里面的結(jié)果哪個(gè)獲取的快,就返回哪個(gè)結(jié)果,不管結(jié)果本身是成功還是失敗
使用場(chǎng)景: Promise.all和Promise.race都是有使用場(chǎng)景的。 有些時(shí)候我們做一個(gè)操作可能得同時(shí)需要不同的接口返回的數(shù)據(jù),這時(shí)我們就可以使用Promise.all; 有時(shí)我們比如說有好幾個(gè)服務(wù)器的好幾個(gè)接口都提供同樣的服務(wù),我們不知道哪個(gè)接口更快,就可以使用Promise.race,哪個(gè)接口的數(shù)據(jù)先回來我們就用哪個(gè)接口的數(shù)據(jù)
let p1 = new Promise((resolve, reject) => { setTimeout(() => { resolve('success') },1000) }) let p2 = new Promise((resolve, reject) => { setTimeout(() => { reject('failed') }, 500) }) Promise.race([p1, p2]).then((result) => { console.log(result) }).catch((error) => { console.log(error) // 打開的是 'failed' })
下面來看幾個(gè)簡(jiǎn)潔易懂的例子:
1.await 可以獲得多個(gè)promise 的返回結(jié)果
2. Promise.all 返回的也是promise,所以可以直接await Promise.all();
1. 使用Promise
function fn(){ return new Promise((resolve,reject)=>{ let randomNum = parseInt(Math.random()*6+1); console.log(randomNum); if(randomNum>3){ resolve('買'); } else{ reject('不買'); } }) } Promise.all([fn(),fn()]).then( (x)=>{console.log(x,'success')},(y)=>{console.log(y,'error'); });
Promise.all 里面參數(shù)為一個(gè)數(shù)組,數(shù)組的每一項(xiàng)是一個(gè)返回promise 的函數(shù)調(diào)用then 的第一個(gè)參數(shù)是所有promise都成功的調(diào)用,返回結(jié)果是一個(gè)數(shù)組,數(shù)組的每一項(xiàng)為函數(shù)promise 的返回結(jié)果。then 的第二個(gè)參數(shù):返回結(jié)果有一個(gè)失敗則執(zhí)行失敗的回調(diào),拿到的是第一個(gè)失敗的值
2. 使用await
await 是可以獲得多個(gè)promise 返回結(jié)果的,Promise.all()返回的也是promise結(jié)果。所以想要使用await 拿到多個(gè)promise的返回值,可以直接await Promise.all();
function fn(){ return new Promise((resolve,reject)=>{ let randomNum = parseInt(Math.random()*6+1); console.log(randomNum); if(randomNum>3){ resolve('買'); } else{ reject('不買'); } }) } async function test(){ try{ let res = await Promise.all([fn(),fn()]); console.log(res,'success'); } catch(error){ console.log(error,'error'); } } test();
Promise.all([fn(),fn()]) 都返回resolve(); 才能夠拿到成功的返回值Promise.all([fn(),fn()]) 有一個(gè)返回reject(), 則進(jìn)入catch(error), 拿到失敗的返回值
總結(jié)
到此這篇關(guān)于Javascript promise.all的用法介紹的文章就介紹到這了,更多相關(guān)promise.all用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Add a Picture to a Microsoft Word Document
Add a Picture to a Microsoft Word Document...2007-06-06javascript鼠標(biāo)跟隨運(yùn)動(dòng)3種效果(眼球效果,蘋果菜單,方向跟隨)
在很多網(wǎng)站上能看到圖片跟隨鼠標(biāo)移動(dòng)的JS特效,其實(shí)做法很簡(jiǎn)單,本文就介紹了很多javascript鼠標(biāo)跟隨運(yùn)動(dòng),在這里與大家分享下。2016-10-10JavaScript 原型繼承之構(gòu)造函數(shù)繼承
JavaScript 是基于原型的面向?qū)ο笳Z言。也就是說,每個(gè)實(shí)例對(duì)象都具有一個(gè)原型。對(duì)象從該原型中繼承屬性和方法。這一篇將具體說說構(gòu)造函數(shù)的繼承。2011-08-08js實(shí)現(xiàn)圖片淡入淡出切換簡(jiǎn)易效果
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)圖片淡入淡出切換簡(jiǎn)易效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08JS簡(jiǎn)單限制textarea內(nèi)輸入字符數(shù)量的方法
這篇文章主要介紹了JS簡(jiǎn)單限制textarea內(nèi)輸入字符數(shù)量的方法,涉及JavaScript響應(yīng)鼠標(biāo)及鍵盤事件處理textarea輸入框字符的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10javascript中String對(duì)象的slice()方法分析
這篇文章主要介紹了javascript中String對(duì)象的slice()方法,以實(shí)例形式分析了slice()方法的定義、參數(shù)與具體用法,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-12-12javascript背景時(shí)鐘實(shí)現(xiàn)方法
這篇文章主要介紹了javascript背景時(shí)鐘實(shí)現(xiàn)方法,涉及javascript時(shí)間及頁面元素樣式的相關(guān)操作技巧,需要的朋友可以參考下2015-06-06