日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

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

新聞中心

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

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

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

簡單示例

通俗的講 AbortController 表示一個控制器對象,允許我們根據需要中止一個或多個 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。

假設這個請求需要等待 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 事件,做一些處理。之后在任何地方調用 ac.abort() 中止 Promise。

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

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

以下關于 doSomeThingAsync 這個異步 Promise Function 的實現基本上也是遵循的這些規(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 中已經有一些異步 API 支持傳遞 signal,但是它的 DOMException 錯誤也是在內部通過封裝來實現的:

 
 
 
  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


網站題目:Node.js v15.x 新特性 — 控制器對象 AbortController
瀏覽地址:http://www.dlmjj.cn/article/dphdpsd.html