成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Promise.any 的作用,如何自己實(shí)現(xiàn)一個 Promise.any

開發(fā) 項目管理
來自世界各地的用戶訪問網(wǎng)站,如果你有多臺服務(wù)器,則盡量使用響應(yīng)速度最快的服務(wù)器,在這種情況下,可以使用 Promise.any() 方法從最快的服務(wù)器接收響應(yīng).

[[396443]]

本文轉(zhuǎn)載自微信公眾號「三分鐘學(xué)前端」,作者sisterAn。轉(zhuǎn)載本文請聯(lián)系三分鐘學(xué)前端公眾號。

引言

本文從五個方面介紹 Promise.any :

  • Promise.any 的作用
  • Promise.any 應(yīng)用場景
  • Promise.any vs Promise.all
  • Promise.any vs Promise.race
  • 手寫 Promise.any 實(shí)現(xiàn)

下面正文開始

Promise.any

Promise.any() 是 ES2021 新增的特性,它接收一個 Promise 可迭代對象(例如數(shù)組),

  • 只要其中的一個 promise 成功,就返回那個已經(jīng)成功的 promise
  • 如果可迭代對象中沒有一個 promise 成功(即所有的 promises 都失敗/拒絕),就返回一個失敗的 promise 和 AggregateError 類型的實(shí)例,它是 Error 的一個子類,用于把單一的錯誤集合在一起
  1. const promises = [ 
  2.   Promise.reject('ERROR A'), 
  3.   Promise.reject('ERROR B'), 
  4.   Promise.resolve('result'), 
  5.  
  6. Promise.any(promises).then((value) => { 
  7.   console.log('value: ', value) 
  8. }).catch((err) => { 
  9.   console.log('err: ', err) 
  10. }) 
  11.  
  12. // value:  result 

如果所有傳入的 promises 都失敗:

  1. const promises = [ 
  2.   Promise.reject('ERROR A'), 
  3.   Promise.reject('ERROR B'), 
  4.   Promise.reject('ERROR C'), 
  5.  
  6. Promise.any(promises).then((value) => { 
  7.   console.log('value:', value) 
  8. }).catch((err) => { 
  9.   console.log('err:', err) 
  10.   console.log(err.message) 
  11.   console.log(err.name
  12.   console.log(err.errors) 
  13. }) 
  14.  
  15. // err:AggregateError: All promises were rejected 
  16. // All promises were rejected 
  17. // AggregateError 
  18. // ["ERROR A""ERROR B""ERROR C"

Promise.any 應(yīng)用場景

  • 從最快的服務(wù)器檢索資源

來自世界各地的用戶訪問網(wǎng)站,如果你有多臺服務(wù)器,則盡量使用響應(yīng)速度最快的服務(wù)器,在這種情況下,可以使用 Promise.any() 方法從最快的服務(wù)器接收響應(yīng)

  1. function getUser(endpoint) { 
  2.   return fetch(`https://superfire.${endpoint}.com/users`) 
  3.     .then(response => response.json()); 
  4.  
  5. const promises = [getUser("jp"), getUser("uk"), getUser("us"), getUser("au"), getUser("in")] 
  6.  
  7. Promise.any(promises).then(value => { 
  8.   console.log(value) 
  9. }).catch(err => { 
  10.   console.log(err); 
  11. }) 
  • 顯示第一張已加載的圖片(來自MDN)

在這個例子,我們有一個獲取圖片并返回 blob 的函數(shù),我們使用 Promise.any() 來獲取一些圖片并顯示第一張有效的圖片(即最先 resolved 的那個 promise)

  1. function fetchAndDecode(url) { 
  2.   return fetch(url).then(response => { 
  3.     if(!response.ok) { 
  4.       throw new Error(`HTTP error! status: ${response.status}`); 
  5.     } else { 
  6.       return response.blob(); 
  7.     } 
  8.   }) 
  9.  
  10. let coffee = fetchAndDecode('coffee.jpg'); 
  11. let tea = fetchAndDecode('tea.jpg'); 
  12.  
  13. Promise.any([coffee, tea]).then(value => { 
  14.   let objectURL = URL.createObjectURL(value); 
  15.   let image = document.createElement('img'); 
  16.   image.src = objectURL; 
  17.   document.body.appendChild(image); 
  18. }) 
  19. .catch(e => { 
  20.   console.log(e.message); 
  21. }); 

Promise.any vs Promise.all

Promise.any() 和 Promise.all() 從返回結(jié)果來看,它們 彼此相反 :

  • Promise.all() :任意一個 promise 被 reject ,就會立即被 reject ,并且 reject 的是第一個拋出的錯誤信息,只有所有的 promise 都 resolve 時才會 resolve 所有的結(jié)果
  • Promise.any() :任意一個 promise 被 resolve ,就會立即被 resolve ,并且 resolve 的是第一個正確結(jié)果,只有所有的 promise 都 reject 時才會 reject 所有的失敗信息

另外,它們又有不同的 重點(diǎn) :

  • Promise.all() 對所有實(shí)現(xiàn)都感興趣。相反的情況(至少一個拒絕)導(dǎo)致拒絕。
  • Promise.any() 對第一個實(shí)現(xiàn)感興趣。相反的情況(所有拒絕)導(dǎo)致拒絕。

Promise.any vs Promise.race

Promise.any() 和 Promise.race() 的 關(guān)注點(diǎn) 不一樣:

  • Promise.any() :關(guān)注于 Promise 是否已經(jīng)解決
  • Promise.race() :主要關(guān)注 Promise 是否已經(jīng)解決,無論它是被解決還是被拒絕

手寫 Promise.any 實(shí)現(xiàn)

Promise.any 只要傳入的 promise 有一個是 fullfilled 則立即 resolve 出去,否則將所有 reject 結(jié)果收集起來并返回 AggregateError

  1. MyPromise.all = function(promises){ 
  2.   return new Promise((resolve,reject)=>{ 
  3.     promises = Array.isArray(promises) ? promises : [] 
  4.     let len = promises.length 
  5.     // 用于收集所有 reject  
  6.     let errs = [] 
  7.     // 如果傳入的是一個空數(shù)組,那么就直接返回 AggregateError 
  8.     if(len === 0) return reject(new AggregateError('All promises were rejected')) 
  9.     promises.forEach((promise)=>{ 
  10.       promise.then(value=>{ 
  11.         resolve(value) 
  12.       },err=>{ 
  13.         len-- 
  14.         errs.push(err) 
  15.         if(len === 0){ 
  16.           reject(new AggregateError(errs)) 
  17.         } 
  18.       }) 
  19.     }) 
  20.   }) 

 

來自:https://github.com/sisterAn/blog

 

責(zé)任編輯:武曉燕 來源: 三分鐘學(xué)前端
相關(guān)推薦

2020-12-15 08:01:24

Promise參數(shù)ES6

2021-04-27 08:31:37

Promisereject信息

2021-03-15 08:15:42

ES2021語言開發(fā)

2021-04-29 08:28:24

架構(gòu)參數(shù)傳遞

2020-09-24 11:46:03

Promise

2025-06-13 09:40:45

2024-05-20 01:10:00

Promise變量

2020-08-31 08:11:01

V8 8.5Promise前端

2018-03-13 16:04:45

Promise執(zhí)行順序

2018-07-03 15:20:36

Promise函數(shù)借錢

2023-09-15 15:31:23

異步編程Promise

2017-05-11 20:20:59

JavascriptPromiseWeb

2020-07-29 17:35:08

Promise源碼前端

2021-09-02 12:07:48

Swift 監(jiān)聽系統(tǒng)Promise

2021-03-09 07:37:42

技術(shù)Promise測試

2022-09-28 12:23:36

Promise代碼

2022-09-15 07:54:59

awaitPromise

2017-04-10 15:57:10

AsyncAwaitPromise

2022-01-21 08:50:15

Promise任務(wù)隊列前端

2015-07-23 11:59:27

JavascriptPromise
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 久久久视频在线 | 在线欧美一区二区 | 亚洲成a人片 | 国产精品69久久久久水密桃 | 91久久精品 | 国产一区二区电影 | 精品国产一区二区三区av片 | 羞羞色视频 | 欧美国产精品一区二区三区 | 日韩午夜电影在线观看 | 水蜜桃久久夜色精品一区 | 天天曰夜夜| 久久久久亚洲国产| 女人毛片a毛片久久人人 | 欧美一级视频免费看 | 91免费在线 | 青青青伊人 | 毛片在线视频 | 性欧美精品一区二区三区在线播放 | 欧美一级免费看 | 亚洲精品一区二区三区蜜桃久 | 久久综合一区 | 一区二区亚洲 | 宅女噜噜66国产精品观看免费 | 成人在线观看亚洲 | 亚洲一区二区精品视频 | 在线免费观看黄色av | 亚洲精品久久久久avwww潮水 | 欧美日韩精品一区二区三区四区 | 国产精品久久久久久久久图文区 | 亚洲成人动漫在线观看 | 欧美综合一区 | 午夜精品一区二区三区在线视频 | 美日韩视频 | 久久久久av | av av在线 | 日日草夜夜草 | 精品久久99 | 欧美在线观看黄色 | 羞羞视频免费观看入口 | 国产精品综合一区二区 |