這篇文章主要介紹JavaScript中Promise.all和Promise.race方法是什么,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括惠城網(wǎng)站建設(shè)、惠城網(wǎng)站制作、惠城網(wǎng)頁制作以及惠城網(wǎng)絡(luò)營(yíng)銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,惠城網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到惠城省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
Promise.all() 方法接受一個(gè)包含 Promise 對(duì)象或普通值的數(shù)組(或其它可迭代對(duì)象)作為參數(shù),并返回一個(gè) Promise。當(dāng)所有 Promise 對(duì)象都 resolve 后,將所有 resolve 值以數(shù)組形式作為 Promise.all() resolve 的結(jié)果。如果其中之一的 Promise 被 reject,立即以第一個(gè) reject 的值作為 Promise.all() reject 結(jié)果。
在實(shí)際應(yīng)用中,如果需要從幾個(gè)接口獲取數(shù)據(jù),并且要在所有數(shù)據(jù)到達(dá)后才執(zhí)行某些操作,就可以使用Promise.all()。
const p1 = new Promise(function (resolve) { setTimeout(resolve, 200, 1) }) const p2 = Promise.resolve(2) const p3 = 3 Promise.all([p1, p2, p3]).then(function (res) { console.log(res) }) // [1,2,3]
以下是代碼實(shí)現(xiàn),需要一個(gè)計(jì)數(shù)器,來確認(rèn)所有 promise 對(duì)象都已經(jīng) resolved,之后返回結(jié)果。需要一個(gè)數(shù)組,按順序記錄返回結(jié)果。如果使用類似 for (var i = 0; i < iterable[i]; i++) 的方式遍歷,為避免閉包只能傳入變量引用的問題,需要嵌套一層自執(zhí)行函數(shù)。這里使用 for ... in 循環(huán),使函數(shù)可以支持除數(shù)組外的其它可迭代對(duì)象,如數(shù)據(jù)結(jié)構(gòu) Set。
const all = function (iterable) { return new Promise(function (resolve, reject) { let count = 0, ans = new Array(count) for (const i in iterable) { const v = iterable[i] if (typeof v === 'object' && typeof v.then === 'function') { v.then(function (res) { ans[i] = res if (--count === 0) resolve(ans) }, reject) count++ } else { ans[i] = v } } }) } const p1 = new Promise(function (resolve) { setTimeout(resolve, 200, 1) }) const p2 = Promise.resolve(2) const p3 = 3 all([p1, p2, p3]).then(function (res) { console.log(res) }) // [1,2,3]
同 Promise.all(),Promise.race() 方法接受一個(gè)包含 Promise 對(duì)象或普通值的數(shù)組(或其它可迭代對(duì)象)作為參數(shù),并返回一個(gè) Promise。一旦其中之一的 Promise 對(duì)象 resolve 以后,立即把 resolve 的值作為 Promise.race() resolve 的結(jié)果。如果其中之一的對(duì)象 reject,Promise.race也會(huì)立即 reject。
在實(shí)際應(yīng)用中,如果可以從幾個(gè)接口獲取相同的數(shù)據(jù),哪個(gè)接口數(shù)據(jù)先到就先用哪個(gè),就可以使用Promise.race(),所需時(shí)間等于其中最快的那個(gè)接口。下面是代碼:
const race = function (iterable) { return new Promise(function (resolve, reject) { for (const i in iterable) { const v = iterable[i] if (typeof v === 'object' && typeof v.then === 'function') { v.then(resolve, reject) } else { resolve(v) } } }) } const p1 = new Promise(function (resolve) { setTimeout(resolve, 200, 1) }) const p2 = new Promise(function (resolve) { setTimeout(resolve, 100, 2) }) race([p1, p2]).then(function (res) { console.log(res) }) // 2
以上是“JavaScript中Promise.all和Promise.race方法是什么”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!