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

AbortSignal:以前我沒得選,現在我想中止Promise

開發 前端
AbortSignal的出現使promise從語義上變為可中止的。并且,只要符合規范,所有異步操作都能變為「可中止的」。AbortSignal是個實驗性API,不過兼容性還不錯,而且polyfill實現起來也不復雜。

[[426765]]

大家好,我卡頌。

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

真是百思不得姐啊...

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

AbortSignal的出現使promise從語義上變為可中止的。并且,只要符合規范,所有異步操作都能變為「可中止的」。

AbortSignal是什么

AbortSignal是個實驗性API,不過兼容性還不錯,而且polyfill實現起來也不復雜。

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

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

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

[[426766]]

只要符合AbortSignal的接入規范,任何異步操作都能實現中止功能。

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

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

其中signal是控制器對應的「信號對象」。

「信號對象」可以監聽abort事件,當信號被中止時被觸發。

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

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

如上代碼調用后會依次打印:

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

在fetch中的應用

fetch API已經集成了AbortSignal。

只需要將controller內的「信號對象」作為signal參數傳給fetch:

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

當調用controller.abort()后,fetch的promise會變為AbortError 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實現取消下載

與任何異步操作結合

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

  1. 將AbortSignal(信號對象)作為API的signal參數傳入
  2. 約定如果API返回的promise變為AbortError DOMException reject則代表操作被中止
  3. 如果signal.aborted === true則立刻讓promise變為reject
  4. 觀測AbortSignal狀態的變化

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

總結

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

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

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

參考資料

[1]取消視頻下載Demo:

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

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

 

責任編輯:姜華 來源: 魔術師卡頌
相關推薦

2022-06-08 13:48:06

物聯網卡智能設備SIM卡

2021-03-09 07:37:42

技術Promise測試

2013-10-09 09:39:17

開源

2021-03-22 08:58:23

程序員產品經理

2018-04-05 22:42:43

2010-12-10 09:11:00

Oracle服務器操作系統

2021-09-06 06:45:06

普通索引唯一

2022-07-05 16:36:19

通信網絡通信故障

2024-11-06 16:07:39

2022-01-04 20:52:50

函數異步Promise

2015-07-27 14:54:57

2021-04-16 07:53:03

Zookeeper分布式系統

2020-09-15 12:59:48

KotlinFlutter移動

2024-01-25 18:00:56

微服務系統KafkaRabbitMQ

2018-02-25 11:00:34

代碼開發程序員

2019-07-08 10:00:46

Redis通訊協議

2018-05-15 15:27:06

IT行業培訓語言

2015-09-16 11:16:25

微軟安卓占領

2018-07-16 16:39:00

數據

2013-06-17 11:21:27

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美视频一区二区三区 | 精品国产乱码久久久久久丨区2区 | 91传媒在线观看 | 国产黄色av网站 | 97人人超碰| 99精品久久| 激情欧美日韩一区二区 | 国产精品视频999 | 一区二区三区四区在线 | 久久夜色精品国产 | 久久久精品一区二区三区 | 成人在线视频一区 | 一区中文字幕 | 久久久久久久一区 | 亚洲一区二区三区四区五区中文 | 日韩欧美国产一区二区三区 | 成人精品免费视频 | 在线观看亚洲专区 | 日本成人免费观看 | 国产精品欧美一区二区 | 亚洲网站在线播放 | 亚洲精品成人av久久 | 国产99视频精品免视看9 | 精品日韩 | 精品在线一区 | 国产精品 欧美精品 | 国产精品免费视频一区 | 国产精品99| 在线超碰 | 国产亚洲精品久久午夜玫瑰园 | 99精品视频一区二区三区 | 国产在线观看网站 | 欧美综合自拍 | 成人一区二区三区在线观看 | 欧美久久综合 | 欧美日韩中文在线 | 亚洲最大的成人网 | 国产一区二区三区久久久久久久久 | 亚洲女人天堂网 | av中文字幕在线观看 | 91精品国产91久久久久久最新 |