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

AbortSignal:以前我沒得選,現(xiàn)在我想中止Promise

開發(fā) 前端
AbortSignal的出現(xiàn)使promise從語義上變?yōu)榭芍兄沟摹2⑶遥灰弦?guī)范,所有異步操作都能變?yōu)椤缚芍兄沟摹埂bortSignal是個實驗性API,不過兼容性還不錯,而且polyfill實現(xiàn)起來也不復(fù)雜。

[[426765]]

大家好,我卡頌。

遙想數(shù)年前的一次面試,面試官問我:promise有什么缺點?

真是百思不得姐啊...

答案是:promise一旦初始化,就不能中止。這是由promise的實現(xiàn)決定的。

AbortSignal的出現(xiàn)使promise從語義上變?yōu)榭芍兄沟摹2⑶遥灰弦?guī)范,所有異步操作都能變?yōu)椤缚芍兄沟摹埂?/p>

AbortSignal是什么

AbortSignal是個實驗性API,不過兼容性還不錯,而且polyfill實現(xiàn)起來也不復(fù)雜。

AbortSignal可以實例化一個「信號對象」(signal object)。

AbortController可以實例化一個「信號對象」的控制器。

就像遙控器可以發(fā)出信號關(guān)電視一樣,AbortController的實例可以控制中止信號。

[[426766]]

只要符合AbortSignal的接入規(guī)范,任何異步操作都能實現(xiàn)中止功能。

舉個例子,首先new一個控制器實例:

  1. // 控制器實例 
  2. const controller = new AbortController(); 
  3. const signal = controller.signal; 

其中signal是控制器對應(yīng)的「信號對象」。

「信號對象」可以監(jiān)聽abort事件,當(dāng)信號被中止時被觸發(fā)。

調(diào)用controller.abort()方法后會中止信號,此時signal.aborted為true。

  1. // 監(jiān)聽 abort 事件 
  2. signal.addEventListener('abort', () => { 
  3.   console.log("信號中止!"
  4. }); 
  5.  
  6. // 控制器中止信號 
  7. controller.abort();  
  8.  
  9. console.log('是否中止:', signal.aborted);  

如上代碼調(diào)用后會依次打印:

  1. 信號中止!
  2. 是否中止:true

在fetch中的應(yīng)用

fetch API已經(jīng)集成了AbortSignal。

只需要將controller內(nèi)的「信號對象」作為signal參數(shù)傳給fetch:

  1. const controller = new AbortController(); 
  2. fetch(url, { 
  3.   signal: controller.signal 
  4. }); 

當(dāng)調(diào)用controller.abort()后,fetch的promise會變?yōu)锳bortError DOMException reject:

  1. fetch('xxxx', { 
  2.   signal: controller.signal 
  3. }).then(() => {}, err => { 
  4.   if (err.name == 'AbortError') {  
  5.     // 中止信號 
  6.   } else { 
  7.     // 其他錯誤 
  8.   } 
  9. }) 

可以在此時處理中止后的操作。

這里有個取消視頻下載Demo[1],可以看看fetch如何配合AbortSignal實現(xiàn)取消下載

與任何異步操作結(jié)合

不僅是fetch,任何異步操作只要符合如下規(guī)范,都可以與AbortError集成:

  1. 將AbortSignal(信號對象)作為API的signal參數(shù)傳入
  2. 約定如果API返回的promise變?yōu)锳bortError DOMException reject則代表操作被中止
  3. 如果signal.aborted === true則立刻讓promise變?yōu)閞eject
  4. 觀測AbortSignal狀態(tài)的變化

如果API應(yīng)用場景比較復(fù)雜(比如需要考慮多線程通信),文檔中提供了一套基于「訂閱發(fā)布」的abort-algorithms[2]機制來完成步驟4。

總結(jié)

雖然AbortSignal原理很簡單,但只要遵守接入規(guī)范,他的可擴展性是很強的。

比如,可以將一個signal傳給多個符合規(guī)范的API,就能用一個控制器中止多個API的調(diào)用。

就像一個遙控器,同時操作家里的空調(diào)、電視、洗衣機,你愛了么?

參考資料

[1]取消視頻下載Demo:

https://mdn.github.io/dom-examples/abort-api/[2]abort-algorithms:

https://dom.spec.whatwg.org/#abortsignal-abort-algorithms

 

責(zé)任編輯:姜華 來源: 魔術(shù)師卡頌
相關(guān)推薦

2022-06-08 13:48:06

物聯(lián)網(wǎng)卡智能設(shè)備SIM卡

2021-03-09 07:37:42

技術(shù)Promise測試

2013-10-09 09:39:17

開源

2021-03-22 08:58:23

程序員產(chǎn)品經(jīng)理

2018-04-05 22:42:43

2021-09-06 06:45:06

普通索引唯一

2022-07-05 16:36:19

通信網(wǎng)絡(luò)通信故障

2024-11-06 16:07:39

2010-12-10 09:11:00

Oracle服務(wù)器操作系統(tǒng)

2022-01-04 20:52:50

函數(shù)異步Promise

2021-04-16 07:53:03

Zookeeper分布式系統(tǒng)

2015-07-27 14:54:57

2020-09-15 12:59:48

KotlinFlutter移動

2024-01-25 18:00:56

微服務(wù)系統(tǒng)KafkaRabbitMQ

2018-02-25 11:00:34

代碼開發(fā)程序員

2018-07-16 16:39:00

數(shù)據(jù)

2013-06-17 11:21:27

2020-12-15 15:21:41

C++JavaPython

2015-02-11 10:37:58

騰訊ROM

2020-02-18 13:55:57

Python 開發(fā)編程語言
點贊
收藏

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

主站蜘蛛池模板: av在线免费观看网站 | 亚洲欧洲精品成人久久奇米网 | 91午夜在线 | 欧美寡妇偷汉性猛交 | 欧美黄色小视频 | 91国产视频在线 | 91资源在线播放 | 欧美日韩亚洲二区 | 国产婷婷精品av在线 | 日本午夜精品 | 在线中文字幕亚洲 | 日韩和的一区二区 | 国产精品国产精品 | 欧美中文在线 | 男人天堂网址 | 日韩视频二区 | 亚洲在线一区二区 | 国产一级一级毛片 | av天天干 | 欧美日产国产成人免费图片 | 国产精品一区二区三区在线 | 精品一区二区三区在线观看国产 | 怡红院成人在线视频 | 91国自视频 | 午夜电影福利 | 二区精品| 久久成人精品视频 | 午夜精品视频 | h片在线观看免费 | 人人艹人人爽 | 性国产xxxx乳高跟 | 久久99国产精品久久99果冻传媒 | 国产在视频一区二区三区吞精 | 欧美日韩综合 | 国产黄色在线观看 | a在线观看| 日日夜夜草 | 久草视频在线播放 | 免费黄色的视频 | 日韩超碰 | 国产在线观看网站 |