日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Node.js v15.x 新特性 — 控制器對象 AbortController

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

成都創(chuàng)新互聯(lián)公司是一家從事企業(yè)網(wǎng)站建設(shè)、成都做網(wǎng)站、成都網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、行業(yè)門戶網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計制作的專業(yè)網(wǎng)站制作公司,擁有經(jīng)驗豐富的網(wǎng)站建設(shè)工程師和網(wǎng)頁設(shè)計人員,具備各種規(guī)模與類型網(wǎng)站建設(shè)的實力,在網(wǎng)站建設(shè)領(lǐng)域樹立了自己獨(dú)特的設(shè)計風(fēng)格。自公司成立以來曾獨(dú)立設(shè)計制作的站點上1000+。

簡單示例

通俗的講 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 中止一個正在運(yùn)行的 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,否則:
  • 使用中止算法機(jī)制來觀察對 AbortSignal 對象的更改,并以不會導(dǎo)致與其他觀察者沖突的方式進(jìn)行觀察。

以下關(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


網(wǎng)站欄目:Node.js v15.x 新特性 — 控制器對象 AbortController
文章源于:http://m.5511xx.com/article/dphdpsd.html