偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

開(kāi)發(fā) 前端
AbortSignal的出現(xiàn)使promise從語(yǔ)義上變?yōu)榭芍兄沟摹2⑶?,只要符合?guī)范,所有異步操作都能變?yōu)椤缚芍兄沟摹?。AbortSignal是個(gè)實(shí)驗(yàn)性API,不過(guò)兼容性還不錯(cuò),而且polyfill實(shí)現(xiàn)起來(lái)也不復(fù)雜。

[[426765]]

大家好,我卡頌。

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

真是百思不得姐啊...

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

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

AbortSignal是什么

AbortSignal是個(gè)實(shí)驗(yàn)性API,不過(guò)兼容性還不錯(cuò),而且polyfill實(shí)現(xiàn)起來(lái)也不復(fù)雜。

AbortSignal可以實(shí)例化一個(gè)「信號(hào)對(duì)象」(signal object)。

AbortController可以實(shí)例化一個(gè)「信號(hào)對(duì)象」的控制器。

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

[[426766]]

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

舉個(gè)例子,首先new一個(gè)控制器實(shí)例:

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

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

「信號(hào)對(duì)象」可以監(jiān)聽(tīng)abort事件,當(dāng)信號(hào)被中止時(shí)被觸發(fā)。

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

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

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

  1. 信號(hào)中止!
  2. 是否中止:true

在fetch中的應(yīng)用

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

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

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

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

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

可以在此時(shí)處理中止后的操作。

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

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

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

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

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

總結(jié)

雖然AbortSignal原理很簡(jiǎn)單,但只要遵守接入規(guī)范,他的可擴(kuò)展性是很強(qiáng)的。

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

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

參考資料

[1]取消視頻下載Demo:

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

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

 

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

2022-06-08 13:48:06

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

2021-03-09 07:37:42

技術(shù)Promise測(cè)試

2013-10-09 09:39:17

開(kāi)源

2021-03-22 08:58:23

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

2018-04-05 22:42:43

2010-12-10 09:11:00

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

2021-09-06 06:45:06

普通索引唯一

2022-07-05 16:36:19

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

2024-11-06 16:07:39

2022-01-04 20:52:50

函數(shù)異步Promise

2015-07-27 14:54:57

2021-04-16 07:53:03

Zookeeper分布式系統(tǒng)

2020-09-15 12:59:48

KotlinFlutter移動(dòng)

2024-01-25 18:00:56

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

2018-02-25 11:00:34

代碼開(kāi)發(fā)程序員

2019-07-08 10:00:46

Redis通訊協(xié)議

2018-05-15 15:27:06

IT行業(yè)培訓(xùn)語(yǔ)言

2015-09-16 11:16:25

微軟安卓占領(lǐng)

2018-07-16 16:39:00

數(shù)據(jù)

2013-06-17 11:21:27

點(diǎn)贊
收藏

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