自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Node.js v15.x 新特性 — 控制器對象 AbortController

開發(fā) 前端
Node.js v15.0.0 提供了一個全局實用 API AbortController,用于在選定的基于 Promise API 中發(fā)出取消信號。無需引入在所有模塊中均可使用,該 API 的實現(xiàn)是基于瀏覽器中的 Web API AbortController。

[[390119]]

 

Node.js v15.0.0 提供了一個全局實用 API AbortController,用于在選定的基于 Promise API 中發(fā)出取消信號。無需引入在所有模塊中均可使用,該 API 的實現(xiàn)是基于瀏覽器中的 Web API AbortController。

簡單示例

通俗的講 AbortController 表示一個控制器對象,允許我們根據(jù)需要中止一個或多個 Web 請求。

下面是一個示例,在 1 秒后會執(zhí)行 ac.abort() 方法,將會觸發(fā) abort 事件,并且僅會觸發(fā)一次,這可通過 abortSignal.aborted 屬性查看前后改變狀態(tài)。

  1. ac.signal.addEventListener('abort', () => { 
  2.   console.log('Aborted!'); 
  3.   console.log('ac.signal.aborted:', ac.signal.aborted); 
  4. }, { once: true }); 
  5. setTimeout(() => ac.abort(), 1000) 
  6. console.log('ac.signal.aborted:', ac.signal.aborted); 

中止請求

Node.js 中我們可以選擇使用 node-fetch 這個請求處理庫,傳遞 signal 給 fetch。

假設(shè)這個請求需要等待 5 秒鐘,大約在 2 秒鐘后執(zhí)行 abort() 將會中止這個請求。

  1. const ac = new AbortController(); 
  2. import fetch from 'node-fetch'
  3.  
  4. const timer = setTimeout(() => ac.abort(), 2000) 
  5. try { 
  6.   const { statusText } = await fetch('http://localhost:3000/api', { signal: ac.signal }) 
  7.   console.log(statusText); 
  8. } catch (err) { 
  9.   console.log(err.name); // AbortError 
  10. } finally { 
  11.   clearTimeout(timer); 

中止 Promise

傳遞 ac.signal 中止一個正在運行的 Promise,這需要我們?yōu)?ac.signal 注冊一個 abort 事件,做一些處理。之后在任何地方調(diào)用 ac.abort() 中止 Promise。

使用 Promise 表示中止操作的任何 Web 平臺 APIs 都必須遵循以下原則:

  • 通過一個 signal 字典成員接受 AbortSignal 對象。
  • 通過 reject 一個帶有 "AbortError" DOMException 這個類的 Promise 來表示操作已中止。
  • 檢查 AbortSignal 對象的 aborted 標(biāo)志是否已經(jīng)被設(shè)置,如果是則立即 reject,否則:
  • 使用中止算法機制來觀察對 AbortSignal 對象的更改,并以不會導(dǎo)致與其他觀察者沖突的方式進行觀察。

以下關(guān)于 doSomeThingAsync 這個異步 Promise Function 的實現(xiàn)基本上也是遵循的這些規(guī)則。

  1. class AbortError extends Error { 
  2.   constructor(message) { 
  3.     super(message); 
  4.     this.name = 'AbortError'
  5.   } 
  6. function doSomethingAsync({ ac }) { 
  7.   return new Promise((resolve, reject) => { 
  8.     console.log('task start...'); 
  9.     if (ac.aborted) { 
  10.       return reject(new AbortError('task handler failed''AbortError')); 
  11.     } 
  12.  
  13.     const timer = setTimeout(() => { 
  14.       console.log('task end...'); 
  15.       resolve(1); 
  16.     }, 5000); 
  17.     ac.signal.addEventListener('abort', () => { 
  18.       clearTimeout(timer); 
  19.       reject(new AbortError('task handler failed''AbortError')); 
  20.     }, { once: true });     
  21.   }); 
  22.  
  23. setTimeout(() => ac.abort(), 2000) 
  24. try { 
  25.   await doSomethingAsync({ ac }); 
  26. } catch (err) { 
  27.   console.error(err.name, err.message); // AbortError task handler failed 

注意:在 Node.js 中目前并沒有 DOMException 這個類,我們無法這樣做 new DOMException('task handler failed', 'AbortError') 所以我在剛開始先創(chuàng)建了一個 AbortError 類來模擬。

Node.js 中已經(jīng)有一些異步 API 支持傳遞 signal,但是它的 DOMException 錯誤也是在內(nèi)部通過封裝來實現(xiàn)的:

  1. // https://github.com/nodejs/node/blob/f6b1df2226/lib/internal/fs/promises.js#L98 
  2.  
  3. const lazyDOMException = hideStackFrames((message, name) => { 
  4.   if (DOMException === undefined) 
  5.     DOMException = internalBinding('messaging').DOMException; 
  6.   return new DOMException(message, name); 
  7. }); 
  8.  
  9. // 例如 writeFileHandle 
  10. // https://github.com/nodejs/node/blob/f6b1df2226/lib/internal/fs/promises.js#L282 
  11. if (signal?.aborted) { 
  12.   throw lazyDOMException('The operation was aborted''AbortError'); 

Reference

https://dom.spec.whatwg.org/#abortcontroller-api-integration

 

https://nodejs.org/docs/latest-v15.x/api/globals.htm

 

責(zé)任編輯:武曉燕 來源: Nodejs技術(shù)棧
相關(guān)推薦

2017-09-22 14:04:33

前端Node.js新特性

2021-12-25 22:29:57

Node.js 微任務(wù)處理事件循環(huán)

2015-09-16 10:17:42

Node.jsES 6特性

2013-11-01 09:34:56

Node.js技術(shù)

2014-04-10 09:43:00

Node.jsTwilio

2015-03-10 10:59:18

Node.js開發(fā)指南基礎(chǔ)介紹

2011-09-08 13:53:31

Node.js

2020-10-12 08:06:28

HTTP 服務(wù)器證書

2011-12-23 10:51:24

Node.js

2011-11-01 10:30:36

Node.js

2011-09-02 14:47:48

Node

2011-09-09 14:23:13

Node.js

2011-09-08 13:46:14

node.js

2021-12-31 19:36:27

js控制臺動畫

2012-10-24 14:56:30

IBMdw

2011-11-10 08:55:00

Node.js

2017-06-02 10:00:26

前端Node.js

2022-02-12 20:33:29

Node.jsStreamfetch API

2023-06-30 08:05:41

2021-03-04 23:12:57

Node.js異步迭代器開發(fā)
點贊
收藏

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