ES6?Promise.all的使用方法以及其細(xì)節(jié)詳解
ES6 Promise.all用法
Promise的all方法提供了并行執(zhí)行異步操作的能力,并且在所有異步操作執(zhí)行完后才執(zhí)行回調(diào)??梢詫⒍鄠€(gè) Promise 實(shí)例,包裝成一個(gè)新的 Promise 實(shí)例。
const p = Promise.all([p1, p2, p3]);
上面代碼中,Promise.all方法接受一個(gè)數(shù)組作為參數(shù),p1、p2、p3都是 Promise 實(shí)例,如果不是,就會(huì)先調(diào)用下面講到的Promise.resolve方法,將參數(shù)轉(zhuǎn)為 Promise 實(shí)例,再進(jìn)一步處理。(Promise.all方法的參數(shù)可以不是數(shù)組,但必須具有 Iterator 接口,且返回的每個(gè)成員都是 Promise 實(shí)例。)
p的狀態(tài)由p1、p2、p3決定,分成兩種情況。
- 只有p1、p2、p3的狀態(tài)都變成fulfilled,p的狀態(tài)才會(huì)變成fulfilled,此時(shí)p1、p2、p3的返回值組成一個(gè)數(shù)組,傳遞給p的回調(diào)函數(shù)。
- 只要p1、p2、p3之中有一個(gè)被rejected,p的狀態(tài)就變成rejected,此時(shí)第一個(gè)被reject的實(shí)例的返回值,會(huì)傳遞給p的回調(diào)函數(shù)。
但是,這里有個(gè)需要注意的細(xì)節(jié)!
如果作為參數(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方法。
then方法也會(huì)把所有異步操作的結(jié)果放進(jìn)一個(gè)數(shù)組中傳給then,就是下面的results。
Promise .all([runAsync1(), runAsync2(), runAsync3()]) .then(function(results){ console.log(results); });
附:promise.all的異步用法
const promise1 = Promise.resolve(3); const promise2 = 42; const promise3 = new Promise((resolve, reject) => { setTimeout(resolve, 100, 'foo'); }); Promise.all([promise1, promise2, promise3]).then((values) => { console.log(values); }); // expected output: Array [3, 42, "foo"]
總結(jié)
到此這篇關(guān)于ES6 Promise.all的使用方法以及其細(xì)節(jié)的文章就介紹到這了,更多相關(guān)ES6 Promise.all使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
layui問題之模擬select點(diǎn)擊事件的實(shí)例講解
今天小編就為大家分享一篇layui問題之模擬select點(diǎn)擊事件的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-08-08javascript原始值和對(duì)象引用實(shí)例分析
這篇文章主要介紹了javascript原始值和對(duì)象引用的方法,實(shí)例分析了javascript原始值和對(duì)象引用的功能、定義與相關(guān)技巧,需要的朋友可以參考下2015-04-04分享Bootstrap簡(jiǎn)單表格、表單、登錄頁(yè)面
本文給大家分享Bootstrap簡(jiǎn)單表格、表單、登錄頁(yè)面的實(shí)例代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下吧2017-08-08詳解JavaScript如何實(shí)現(xiàn)更短時(shí)間的延時(shí)函數(shù)
在項(xiàng)目開發(fā)中,經(jīng)常能遇到需要延時(shí)執(zhí)行的需求,比如實(shí)現(xiàn)一個(gè)定時(shí)器功能,本文主要和大家介紹了JS如何實(shí)現(xiàn)更短時(shí)間的延時(shí)函數(shù),需要的可以參考下2024-03-03微信小程序顯示倒計(jì)時(shí)功能示例【測(cè)試可用】
這篇文章主要介紹了微信小程序顯示倒計(jì)時(shí)功能,結(jié)合實(shí)例形式分析了微信小程序針對(duì)給定時(shí)間的倒計(jì)時(shí)功能相關(guān)界面顯示與邏輯運(yùn)算操作技巧,需要的朋友可以參考下2018-12-12javascript生成/解析dom的CDATA類型的字段的代碼
javascript生成/解析dom的CDATA類型的字段的代碼...2007-04-04???????基于el-table和el-pagination實(shí)現(xiàn)數(shù)據(jù)的分頁(yè)效果流程詳解
本文主要介紹了???????基于el-table和el-pagination實(shí)現(xiàn)數(shù)據(jù)的分頁(yè)效果,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-11-11設(shè)為首頁(yè)和收藏的Javascript代碼(親測(cè)兼容IE,Firefox,chrome等瀏覽器)
這篇文章主要介紹了設(shè)為首頁(yè)和收藏的Javascript代碼(親測(cè)兼容IE,Firefox,chrome等瀏覽器)。需要的朋友可以過來參考下,希望對(duì)大家有所幫助2013-11-11