精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何使用Promise.race() 和 Promise.any() ?

開發 前端
自1996年發布以來,JS 一直在穩步改進。隨著ECMAScript版本的許多改進,最近的版本是ES2020。JS 的一個重要更新是Promise,在2015年,它以 ES6 的名義發布。

 [[357642]]

自1996年發布以來,JS 一直在穩步改進。隨著ECMAScript版本的許多改進,最近的版本是ES2020。JS 的一個重要更新是Promise,在2015年,它以 ES6 的名義發布。

什么是 Promise ?

MDN 上對 Promise 的定義:Promise 對象用于表示一個異步操作的最終完成 (或失敗)及其結果值。對于新手來說,這聽起來可能有點太復雜了。

國外一位大什么對Promises的解釋如下:“想象一下你是個孩子。你老媽向你保證,她下周會給你買一部新手機。”

你要到下周才能知道你是否能獲取那部手機。你老媽要么真的給你買了一個全新的手機,要么因為不開心就不給你買。

這個就是一個Promise。一個Promise有三個狀態。分別是:

  1. Pending:你不知道你是否能得到那部手機
  2. Fulfilled:老媽高興了,給你買了
  3. Rejected:老娘不開森了,不給你買了

這個是我目前聽到,最快能理解 Promise 事例。

如果你還沒有開始學習 Promise ,建議你這樣做。

Promise包含幾種非常有用的內置方法。今天我們主要介紹這兩種方法。

  • Promise.race()-與 ES6 一起發布
  • Promise.any() -仍處于第4階段的提案中

Promise.race()

Promise.race()方法最初是在 ES6 中引入 Promise 時發布的,這個方法需要一個iterable作為參數。

Promise.race(iterable) 方法返回一個 promise,一旦迭代器中的某個promise解決或拒絕,返回的 promise 就會解決或拒絕。

與Promise.any()方法不同,Promise.race()方法主要關注 Promise 是否已解決,而不管其被解決還是被拒絕。

語法

  1. Promise.race(iterable) 

參數

iterable — 可迭代對象,類似 Array。iterable 對象實現Symbol.iterator方法。

返回值

一個待定的 Promise 只要給定的迭代中的一個promise解決或拒絕,就采用第一個promise的值作為它的值,從而異步地解析或拒絕(一旦堆棧為空)。

注意

因為參數接受iterable,所以我們可以傳遞一些值,比如基本值,甚至數組中的對象。在這種情況下,race方法將返回傳遞的第一個非 promise 對象。這主要是因為方法的行為是在值可用時(當 promise 滿足時)立即返回值。

此外,如果在iterable中傳遞了已經解決的Promise,則Promise.race()方法將解析為該值的第一個。如果傳遞了一個空的Iterable,則race方法將永遠處于待處理狀態。

事例

  1. const promise1 = new Promise((resolve, reject) => { 
  2.     setTimeout(resolve, 500, 'promise 1 resolved'); 
  3. }); 
  4.  
  5. const promise2 = new Promise((resolve, reject) => { 
  6.     setTimeout(reject, 100, 'promise 2 rejected'); 
  7. }); 
  8.  
  9. const promise3 = new Promise((resolve, reject) => { 
  10.     setTimeout(resolve, 200, 'promise 3 resolved'
  11. }); 
  12.  
  13. (async () => { 
  14.     try { 
  15.         let result = await Promise.race([promise1, promise2, promise3]); 
  16.         console.log(result); 
  17.     } catch (err) { 
  18.         console.error(err); 
  19.     } 
  20. })(); 
  21.   // 輸出- "promise 2 rejected" 
  22.   // 盡管promise1和promise3可以解決,但promise2拒絕的速度比它們快。 
  23.   // 因此Promise.race方法將以promise2拒絕 

真實用例

現在,你可能想知道,我們在實戰中何時 Promise.race() ?來看看。

在請求數據時,顯示加載動畫

使用加載動畫開發中是非常常見。當數據響應時間較長時,如果沒使用加載動畫,看起來就像沒有響應一樣。但有時,響應太快了,我們需要加載動畫時,增加一個非常小延遲時間,這樣會讓用戶覺得我是在經常請求過來的。要實現這一點,只需使用Promise.race()方法,如下所示。

  1. function getUserInfo(user) { 
  2.   return new Promise((resolve, reject) => { 
  3.     // had it at 1500 to be more true-to-life, but 900 is better for testing 
  4.     setTimeout(() => resolve("user data!"), Math.floor(900*Math.random())); 
  5.   }); 
  6.  
  7. function showUserInfo(user) { 
  8.   return getUserInfo().then(info => { 
  9.     console.log("user info:", info); 
  10.     return true
  11.   }); 
  12.  
  13. function showSpinner() { 
  14.   console.log("please wait..."
  15.  
  16. function timeout(delay, result) { 
  17.   return new Promise(resolve => { 
  18.     setTimeout(() => resolve(result), delay); 
  19.   }); 
  20. Promise.race([showUserInfo(), timeout(300)]).then(displayed => { 
  21.   if (!displayed) showSpinner(); 
  22. }); 

**取消的 Promise **

有些情況下,我們需要取消 Promise,這時也可以借助 Promise.race() 方法:

  1. function timeout(delay) { 
  2.   let cancel; 
  3.   const wait = new Promise(resolve => { 
  4.     const timer = setTimeout(() => resolve(false), delay); 
  5.     cancel = () => { 
  6.       clearTimeout(timer); 
  7.       resolve(true); 
  8.     }; 
  9.   }); 
  10.   wait.cancel = cancel; 
  11.   return wait; 
  12.  
  13.  
  14. function doWork() { 
  15.   const workFactor = Math.floor(600*Math.random()); 
  16.   const work = timeout(workFactor); 
  17.    
  18.   const result = work.then(canceled => { 
  19.     if (canceled) 
  20.       console.log('Work canceled'); 
  21.     else 
  22.       console.log('Work done in', workFactor, 'ms'); 
  23.     return !canceled; 
  24.   }); 
  25.   result.cancel = work.cancel; 
  26.   return result; 
  27.  
  28. function attemptWork() { 
  29.   const work = doWork(); 
  30.   return Promise.race([work, timeout(300)]) 
  31.     .then(done => { 
  32.       if (!done) 
  33.         work.cancel(); 
  34.       return (done ? 'Work complete!' : 'I gave up'); 
  35.   }); 
  36.  
  37. attemptWork().then(console.log); 

批處理請求,用于長時間執行

Chris Jensen 有一個有趣的race()方法用例。他曾使用Promise.race()方法批處理長時間運行的請求。這樣一來,他們可以保持并行請求的數量固定。

  1. const _ = require('lodash'
  2.  
  3. async function batchRequests(options) { 
  4.     let query = { offset: 0, limit: options.limit }; 
  5.  
  6.     do { 
  7.         batch = await model.findAll(query); 
  8.         query.offset += options.limit; 
  9.  
  10.         if (batch.length) { 
  11.             const promise = doLongRequestForBatch(batch).then(() => { 
  12.                 // Once complete, pop this promise from our array 
  13.                 // so that we know we can add another batch in its place 
  14.                 _.remove(promises, p => p === promise); 
  15.             }); 
  16.             promises.push(promise); 
  17.  
  18.             // Once we hit our concurrency limit, wait for at least one promise to 
  19.             // resolve before continuing to batch off requests 
  20.             if (promises.length >= options.concurrentBatches) { 
  21.                 await Promise.race(promises); 
  22.             } 
  23.         } 
  24.     } while (batch.length); 
  25.  
  26.     // Wait for remaining batches to finish 
  27.     return Promise.all(promises); 
  28.  
  29. batchRequests({ limit: 100, concurrentBatches: 5 }); 

Promise.any()

Promise.any() 接收一個Promise可迭代對象,只要其中的一個 promise 成功,就返回那個已經成功的 promise 。如果可迭代對象中沒有一個 promise 成功(即所有的 promises 都失敗/拒絕),就返回一個失敗的 promise 和AggregateError類型的實例,它是 Error 的一個子類,用于把單一的錯誤集合在一起。本質上,這個方法和Promise.all()是相反的。

注意!Promise.any() 方法依然是實驗性的,尚未被所有的瀏覽器完全支持。它當前處于 TC39 第四階段草案(Stage 4)

語法

  1. Promise.any(iterable); 

參數

iterable — 個可迭代的對象, 例如 Array。

返回值

  • 如果傳入的參數是一個空的可迭代對象,則返回一個 已失敗(already rejected) 狀態的 Promise。
  • 如果傳入的參數不包含任何 promise,則返回一個 **異步完成 (asynchronously resolved)**的 Promise。
  • 其他情況下都會返回一個處理中(pending) 的 Promise。只要傳入的迭代對象中的任何一個 promise 變成成功(resolve)狀態,或者其中的所有的 promises 都失敗,那么返回的 promise 就會 異步地(當調用棧為空時) 變成成功/失敗(resolved/reject)狀態。

說明

這個方法用于返回第一個成功的 promise 。只要有一個 promise 成功此方法就會終止,它不會等待其他的 promise 全部完成。

不像 Promise.all() 會返回一組完成值那樣(resolved values),我們只能得到一個成功值(假設至少有一個 promise 完成)。當我們只需要一個 promise 成功,而不關心是哪一個成功時此方法很有用的。

同時, 也不像 Promise.race() 總是返回第一個結果值(resolved/reject)那樣,這個方法返回的是第一個 成功的 值。這個方法將會忽略掉所有被拒絕的 promise,直到第一個 promise 成功。

事例

  1. const promise1 = new Promise((resolve, reject) => { 
  2.   setTimeout(reject, 100, 'promise 1 rejected'); 
  3. }); 
  4.  
  5. const promise2 = new Promise((resolve, reject) => { 
  6.   setTimeout(resolve, 400, 'promise 2 resolved at 400 ms'); 
  7. }); 
  8.  
  9. const promise3 = new Promise((resolve, reject) => { 
  10.   setTimeout(resolve, 700, 'promise 3 resolved at 800 ms'); 
  11. }); 
  12.  
  13. (async () => { 
  14.   try { 
  15.     let value = await Promise.any([promise1, promise2, promise3]); 
  16.     console.log(value); 
  17.   } catch (error) { 
  18.     console.log(error); 
  19.   } 
  20. })(); 
  21.  
  22. //Output - "promise 2 resolved at 400 ms" 

從上面代碼注意到Promise.any()主要關注解析的值。它會忽略在100毫秒時拒絕的promise1,并考慮在400毫秒后解析的promise2的值。

真實用例

從最快的服務器檢索資源

假設訪問我們網站的用戶可能來自全球各地。如果我們的服務器基于單個位置,那么響應時間將根據每個用戶的位置而不同。但是如果我們有多個服務器,可以使用能夠產生最快響應的服務器。在這種情況下,可以使用Promise.any()方法從最快的服務器接收響應。

我是小智,我們下期再見!

作者:Mahdhi Rezvi 譯者:前端小智 來源: medium

原文:https://blog.bitsrc.io/introduction-to-promise-race-and-promise-any-with-real-life-examples-9d8d1b9f8ec9

本文轉載自微信公眾號「大遷世界」,可以通過以下二維碼關注。轉載本文請聯系大遷世界公眾號。

 

責任編輯:武曉燕 來源: 大遷世界
相關推薦

2021-04-28 08:21:21

Promise.any服務器場景

2024-05-20 01:10:00

Promise變量

2023-09-15 15:31:23

異步編程Promise

2020-09-18 09:02:20

JavaScript

2021-03-15 08:15:42

ES2021語言開發

2023-01-12 11:23:11

Promise異步編程

2022-09-28 12:23:36

Promise代碼

2021-04-29 08:28:24

架構參數傳遞

2020-07-29 17:35:08

Promise源碼前端

2023-10-08 10:21:11

JavaScriptAsync

2021-04-27 08:31:37

Promisereject信息

2019-12-09 15:20:09

JavascriptPromise前端

2018-03-13 16:04:45

Promise執行順序

2021-03-09 07:37:42

技術Promise測試

2023-10-04 07:25:59

JavaScriptpromises

2021-09-02 12:07:48

Swift 監聽系統Promise

2022-01-21 08:50:15

Promise任務隊列前端

2016-11-01 19:22:36

Javascript前端Promise

2017-05-11 20:20:59

JavascriptPromiseWeb

2015-07-23 11:59:27

JavascriptPromise
點贊
收藏

51CTO技術棧公眾號

福利一区二区免费视频| 蜜臀久久久久久999| 精品国产一区二区三区久久久蜜臀 | 亚洲宅男天堂在线观看无病毒| 欧美一区二区三区视频在线观看| 9l视频自拍9l视频自拍| 免费看日韩av| 日韩电影在线一区二区三区| 裸体女人亚洲精品一区| 国产精品久久久免费观看| 中韩乱幕日产无线码一区| 亚洲免费av在线| 欧美乱偷一区二区三区在线| 国产情侣自拍小视频| 国产精品一卡| 欧美不卡视频一区发布| 中文人妻一区二区三区| 精品久久免费| 91成人免费网站| 黄色特一级视频| av电影在线网| 99精品久久只有精品| 国产主播精品在线| 日韩欧美在线观看免费| 亚洲性人人天天夜夜摸| xvideos亚洲| av男人的天堂av| 国产精品视屏| 日韩亚洲欧美高清| 自拍偷拍一区二区三区四区| 亚洲精品永久免费视频| 亚洲一区二区视频| 色呦呦网站入口| 高清av在线| 久久你懂得1024| 国产一区二区不卡视频| 国产成人久久精品77777综合| 视频一区二区不卡| 欧美伊久线香蕉线新在线| 国产一卡二卡在线播放| 亚洲综合激情在线| 精品国内自产拍在线观看| 日本二区在线观看| 久草成人资源| 亚洲欧美激情四射在线日| 国产美女视频免费观看下载软件| 精品成人18| 91精品国产综合久久久蜜臀图片 | 欧美一级视频在线观看| 欧美激情 一区| 首页亚洲中字| 亚洲国产精品字幕| 69亚洲乱人伦| 9999久久久久| 亚洲国产精品福利| 亚洲视频 中文字幕| 1769国产精品视频| 欧美videos中文字幕| 中文字幕av一区二区三区人妻少妇| 欧美日韩免费电影| 911精品国产一区二区在线| 天天色综合社区| 欧美videos粗暴| 欧美欧美欧美欧美首页| 777一区二区| 91成人在线网站| 精品久久久久久综合日本欧美| 亚洲女人在线观看| 91精品导航| 日韩不卡在线观看| 丰腴饱满的极品熟妇| 国产一区二区三区天码| 中文字幕亚洲色图| 欧美被狂躁喷白浆精品| 中出一区二区| 欧美大奶子在线| 欧美一级高潮片| 久久精品人人| 成人激情免费在线| 亚洲精品国产一区二| 不卡电影一区二区三区| 欧美区高清在线| 成人在线播放免费观看| 亚洲国产乱码最新视频| 亚洲人成无码www久久久| 国产69精品久久久久9999人| 欧美一区二区三区免费在线看| 在线成人精品视频| 伊人久久大香线蕉| 久久久国产精品x99av| 精品一区二区三区四| 男人的天堂成人在线| 国产欧美日韩专区发布| 蜜臀av午夜精品| 中文字幕精品一区二区三区精品| 国产又粗又爽又黄的视频| 精精国产xxxx视频在线野外 | 精品国产拍在线观看| 欧美精品一级片| 视频一区视频二区中文| 91亚洲精品久久久久久久久久久久| 人人妻人人玩人人澡人人爽| 国产目拍亚洲精品99久久精品| 精品久久久无码人妻字幂| 欧美亚洲韩国| 日韩一区二区中文字幕| 免费观看av网站| 中文无码久久精品| 日韩av手机在线观看| 国内精品久久久久久久久久| 久久精品在线观看| 国产91视频一区| 成人毛片免费| 日韩精品在线观| 国模无码国产精品视频| 免费成人av资源网| 久久精品午夜一区二区福利| 黄色一级片在线观看| 欧美日韩亚洲激情| 无码人妻一区二区三区一| 第一sis亚洲原创| 97在线视频观看| 精品国产亚洲一区二区麻豆| 国产日韩av一区二区| 国产毛片视频网站| 亚洲专区**| 久久久国产精品视频| 狠狠躁夜夜躁人人爽视频| av亚洲精华国产精华精华| 色一情一乱一乱一区91| 欧美日韩五码| 亚洲精品一区二区三区不| 久久精品视频6| 国产一区二区导航在线播放| 午夜老司机精品| 91大神在线观看线路一区| 亚洲国产欧美一区二区三区同亚洲| 最新一区二区三区| 久久精品国产秦先生| 欧美一区二区三区成人久久片| gogo高清在线播放免费| 欧美一级夜夜爽| 在线免费看av网站| 激情都市一区二区| 在线成人性视频| 国产精品日本一区二区三区在线| www国产精品视频| 一卡二卡三卡在线观看| 国产精品久久久久一区| 日本黄大片一区二区三区| 青青草91久久久久久久久| 国产精品第一区| аⅴ资源新版在线天堂| 欧美日韩一区国产| 日本视频在线免费| 久久97超碰国产精品超碰| 伊人天天久久大香线蕉av色| 亚洲二区av| 久久综合色88| 亚洲欧美另类视频| 亚洲1区2区3区视频| 国产精品久久久久久久无码| 国产欧美午夜| 日韩欧美国产二区| 日韩成人一区| 欧美刺激性大交免费视频| 亚洲伦理在线观看| 狠狠综合久久av一区二区小说| 久久丫精品国产亚洲av不卡| 日韩精品一二三| 国产日韩视频在线播放| 一区二区三区四区视频免费观看| 久久久久久噜噜噜久久久精品| 天天干视频在线| 在线观看不卡视频| 天天色影综合网| 高清国产午夜精品久久久久久| www.av中文字幕| 欧美精品一区二区久久| 成人写真视频福利网| 激情av在线播放| 亚洲男人的天堂网站| 成人黄色片在线观看| 中文字幕一区二区不卡| 精品无码av一区二区三区不卡| 宅男噜噜噜66一区二区| 日韩国产精品一区二区| 欧美高清hd| 欧美怡红院视频一区二区三区| 91短视频版在线观看www免费| 欧美一级片免费看| 中文字幕免费观看| 亚洲精品日韩综合观看成人91| 亚洲少妇18p| 麻豆91在线看| 国产免费黄色av| 午夜激情久久| 免费成人深夜夜行视频| 国产99对白在线播放| 亚洲成人自拍一区| 国产日韩精品中文字无码| 丁香啪啪综合成人亚洲小说| 成人3d动漫一区二区三区| 牛夜精品久久久久久久99黑人| 久久久久久九九| 日韩大陆av| 热久久这里只有| 日韩欧美一起| 色偷偷88888欧美精品久久久 | 久草精品视频在线观看| 国产精品色哟哟网站| 日本护士做爰视频| 国产综合色产在线精品| 88av.com| 亚洲永久免费| 国产 欧美 日韩 一区| 久久高清精品| 蜜桃导航-精品导航| 综合欧美亚洲| 亚洲一区二区三区四区视频| 国产成人精品123区免费视频| 欧美精品久久一区二区| 麻豆av在线免费看| 亚洲色图第三页| 日本福利片高清在线观看| 精品欧美黑人一区二区三区| 91高潮大合集爽到抽搐| 在线一区二区三区| 欧美国产成人精品一区二区三区| 亚洲成人1区2区| 久久久久久国产精品免费播放| 亚洲欧美在线高清| 四季av中文字幕| 国产欧美综合色| 在线不卡av电影| 久久尤物电影视频在线观看| 手机免费看av片| 成人深夜视频在线观看| 亚洲色图欧美另类| 成人免费观看男女羞羞视频| 超碰人人cao| 国产精品一二三在| 亚洲av毛片在线观看| 国产在线一区二区综合免费视频| 亚洲欧美久久久久| 麻豆国产一区二区| 中文字幕在线观看日| 蜜桃av噜噜一区| 亚洲xxx在线观看| 久久国产日韩欧美精品| 日韩av.com| 国产麻豆精品在线观看| 久久久久中文字幕亚洲精品| 国产高清一区日本| 91传媒理伦片在线观看| 99re免费视频精品全部| 在线免费观看麻豆| 久久亚区不卡日本| 欧美18—19性高清hd4k| 国产精品麻豆99久久久久久| 亚洲欧美卡通动漫| 亚洲男人的天堂网| 国产亚洲精品av| 精品国产成人在线| 国产黄色免费视频| 欧美美女黄视频| 亚洲精品综合网| 亚洲欧美国产日韩天堂区| eeuss影院www在线观看| 日韩少妇与小伙激情| 中文字幕伦理免费在线视频 | 日韩黄色片在线| 最新亚洲视频| 日本老熟妇毛茸茸| 国产一区二区美女| 中文字幕在线永久| 国产人妖乱国产精品人妖| 久久久久麻豆v国产| 一区二区三区精密机械公司| 国产香蕉视频在线| 欧美亚洲动漫制服丝袜| 99热这里只有精品在线观看| 亚洲精品电影网| av电影在线播放高清免费观看| 麻豆成人在线看| 一区二区三区四区日本视频| 国产精品日韩精品| 草草视频在线一区二区| 日韩欧美精品一区二区三区经典| 欧美一区二区三区久久精品| 男人揉女人奶房视频60分| 久久激情综合网| 欧美大喷水吹潮合集在线观看| 国产欧美日韩一区二区三区在线观看| 日韩欧美综合视频| 色欧美片视频在线观看在线视频| 国产又大又黄又爽| 精品无人区乱码1区2区3区在线| av在线播放网| 国模精品视频一区二区| 91成人在线| 极品日韩久久| 欧美日韩国产在线一区| 色诱视频在线观看| 粉嫩aⅴ一区二区三区四区 | 欧美在线一卡| 欧美成人自拍视频| 成人18视频在线观看| 国产另类自拍| 一精品久久久| 国产九九在线观看| 91麻豆国产福利在线观看| 中文字幕av久久爽av| 在线观看中文字幕不卡| 国产成人手机在线| 久久视频免费在线播放| 国产欧美一区二区三区精品酒店| 成人自拍视频网站| 91精品一区国产高清在线gif| 成人一区二区三| 99久久久久久| 日本熟妇色xxxxx日本免费看| 欧美日韩高清一区二区不卡| 青青九九免费视频在线| 久久免费国产视频| 精品国产亚洲一区二区三区在线| 亚洲精品免费在线看| 香蕉久久a毛片| 性囗交免费视频观看| 一卡二卡三卡日韩欧美| 国产精品污视频| 久久韩剧网电视剧| 男人天堂久久| 中文字幕欧美日韩一区二区三区 | 国产精品成人av性教育| 日韩精品欧美大片| 国产美女主播在线播放| 国产成人鲁色资源国产91色综| 免费看特级毛片| 在线不卡免费欧美| 一广人看www在线观看免费视频| 日韩av片免费在线观看| 欧美色资源站| 成人免费观看视频在线观看| 99视频在线精品| 五月婷婷激情网| 日韩av中文字幕在线| 96av在线| 免费一区二区三区| 老牛嫩草一区二区三区日本| 久久久久亚洲av成人无码电影| 色综合av在线| 中国日本在线视频中文字幕| 国产美女91呻吟求| 91精品国产乱码久久久久久久| 超碰在线超碰在线| 午夜欧美视频在线观看| 少妇一区二区三区四区| 69av在线视频| 国产亚洲一区| 亚洲精品免费一区亚洲精品免费精品一区 | 日本三级视频在线播放| 成人精品视频99在线观看免费| 68国产成人综合久久精品| 在线观看一区二区三区视频| 亚洲综合激情另类小说区| 亚洲精品无遮挡| 欧美专区第一页| 国产一区不卡| 99中文字幕在线| 亚洲国产综合91精品麻豆| 天堂a中文在线| 国产精品偷伦一区二区| 亚洲免费二区| av黄色一级片| 欧美视频一区二区三区| 国产福利视频在线观看| 国产精品一级久久久| 六月丁香综合| 日本裸体美女视频| 欧美精品一区二区三区很污很色的| 美女露胸视频在线观看| 亚洲精品在线免费| 国产91富婆露脸刺激对白| 亚洲 欧美 成人| 久久福利视频网| 欧洲在线一区| 色一情一区二区三区| 亚洲成人av一区二区三区| av资源网站在线观看| 国产精品大全| 免费一区二区视频| 久久一级黄色片| 一区二区在线视频播放| 57pao国产一区二区| 麻豆三级在线观看| 亚洲成人免费看| avtt亚洲| 久久偷窥视频| 国产一区欧美二区|