日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

如何優雅地取消 JavaScript 異步任務

瀏覽:176日期:2023-11-07 09:57:37

在程序中處理異步任務通常比較麻煩,尤其是那些不支持取消異步任務的編程語言。所幸的是,JavaScript 提供了一種非常方便的機制來取消異步任務。

中斷信號

自從 ES2015 引入了 Promise ,開發者有了取消異步任務的需求,隨后推出的一些 Web API 也開始支持異步方案,比如 Fetch API。TC39 委員會(就是制定 ECMAScript 標準的組織)最初嘗試定義一套通用的解決方案,以便后續作為 ECMAScript 標準。但是后來討論不出什么結果來,這個問題也就擱置了。鑒于此,WHATWG (HTML 標準制定組織)另起爐灶,自己搞出一套解決方案,直接在 DOM 標準上引入了 AbortController。這種做法的壞處顯而易見,因為它不是語言層面的 ECMAScript 標準,因此 Node.js 平臺也就不支持 AbortController 。

在 DOM 規范里, AbortController 設計得非常通用,因此事實上你可以用在任何異步 API 中。目前只得到 Fetch API 的官方支持,但你完全可以用在自己的異步代碼里。

在開始介紹之前,我們先看下 AbortController 的工作原理:

const abortController = new AbortController(); // 1const abortSignal = abortController.signal; // 2fetch( ’http://kaysonli.com’, { signal: abortSignal // 3} ).catch( ( { message } ) => { // 5 console.log( message );} );abortController.abort(); // 4

上面的代碼很簡單,首先創建了AbortController的一個實例(1),并將它的 signal 屬性賦值給一個變量(2)。然后調用fetch()并傳入 signal 參數(3)。取消請求時調用 abortController.abort()(4)。這樣就會自動執行fetch() 的 reject ,也就是進入catch()部分(5)。

它的signal屬性是核心所在。該屬性是 AbortSignal DOM 接口的實例,它有一個 aborted屬性,帶有是否調用了 abortController.abort()的相關信息。還可以在上面監聽abort事件,該事件在abortController.abort()調用時觸發。簡單來說,AbortController 就是AbortSignal的一個公開接口。

可取消的函數

假設有一個執行復雜計算的異步函數,為簡單起見,我們就用定時器模擬:

function calculate() { return new Promise( ( resolve, reject ) => { setTimeout( ()=> { resolve( 1 ); }, 5000 ); } );}calculate().then( ( result ) => { console.log( result );} );

可能的情況是,用戶想取消這種耗時的任務。我們用一個按鈕來開始和停止:

<button id='calculate'>Calculate</button><script type='module'> document.querySelector( ’#calculate’ ).addEventListener( ’click’, async ( { target } ) => { // 1 target.innerText = ’Stop calculation’; const result = await calculate(); // 2 alert( result ); // 3 target.innerText = ’Calculate’; } ); function calculate() { return new Promise( ( resolve, reject ) => { setTimeout( ()=> { resolve( 1 ); }, 5000 ); } ); }</script>

上面的代碼給按鈕綁定了一個異步的 click 事件處理器(1),并在里面調用了 calculate() 函數(2)。5 秒后會彈出對話框顯示結果(3)。順便提一下,script[type=module]可以讓 JavaScript 代碼進入嚴格模式,跟 ’use strict’ 的效果一樣。

增加中斷異步任務的功能:

{ // 1 let abortController = null; // 2 document.querySelector( ’#calculate’ ).addEventListener( ’click’, async ( { target } ) => { if ( abortController ) { abortController.abort(); // 5 abortController = null; target.innerText = ’Calculate’; return; } abortController = new AbortController(); // 3 target.innerText = ’Stop calculation’; try { const result = await calculate( abortController.signal ); // 4 alert( result ); } catch { alert( ’WHY DID YOU DO THAT?!’ ); // 9 } finally { // 10 abortController = null; target.innerText = ’Calculate’; } } ); function calculate( abortSignal ) { return new Promise( ( resolve, reject ) => { const timeout = setTimeout( ()=> { resolve( 1 ); }, 5000 ); abortSignal.addEventListener( ’abort’, () => { // 6 const error = new DOMException( ’Calculation aborted by the user’, ’AbortError’ ); clearTimeout( timeout ); // 7 reject( error ); // 8 } ); } ); }}

代碼變長了很多,但是別慌,理解起來也不是很難。

最外層的代碼塊(1)相當于一個 IIFE(立即執行的函數表達式),這樣變量 abortController(2)就不會污染全局了。

首先把它的值設為null,并且它的值隨著按鈕點擊而改變。隨后給它賦值為AbortController的一個實例(3),再把實例的signal屬性直接傳給 calculate()函數(4)。

如果用戶在 5 秒之內再次點擊按鈕,就會執行abortController.abort()函數(5)。這樣就會在剛才傳給 calculate()的AbortSignal實例上觸發 abort 事件(6)。

在 abort 事件處理器里面清除定時器(7),然后用一個適當的異常對象拒絕 Promise(8)。

根據 DOM 規范,這個異常對象必須是一個’AbortError’ 類型的DOMException。

這個異常對象最終傳給了catch (9) 和finally (10)。

但是還要考慮這樣一種情況:

const abortController = new AbortController();abortController.abort();calculate( abortController.signal );

這種情況下 abort 事件不會觸發,因為它在signal傳給calculate() 函數前就執行了。為此我們需要改造下代碼:

function calculate( abortSignal ) { return new Promise( ( resolve, reject ) => { const error = new DOMException( ’Calculation aborted by the user’, ’AbortError’ ); // 1 if ( abortSignal.aborted ) { // 2 return reject( error ); } const timeout = setTimeout( ()=> { resolve( 1 ); }, 5000 ); abortSignal.addEventListener( ’abort’, () => { clearTimeout( timeout ); reject( error ); } ); } );}

異常對象的定義移到了頂部(1),這樣就可以在兩個地方重用了。另外,多了個條件判斷abortSignal.aborted(2)。如果它的值是true,calculate()函數應該立即拒絕 Promise,沒必要再往下執行了。到這里我們就實現了一個完整的可取消的異步函數,以后碰到需要處理異步任務的地方就可以派上用場了。

到此這篇關于如何優雅地取消 JavaScript 異步任務的文章就介紹到這了,更多相關JavaScript 取消異步任務內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产欧美日韩一区二区三区在线| 99成人在线| 国产欧美日韩影院| 国产精品亚洲人成在99www| 日韩av中文字幕一区| 欧美日韩亚洲国产精品| 国产精品久久久久久妇女| 国精品产品一区| 欧美精品高清| 亚洲欧美视频一区二区三区| 亚洲乱亚洲高清| 亚洲日本免费电影| 久久av日韩| 99久久精品费精品国产| 美女日韩在线中文字幕| 久久国产乱子精品免费女| 国产一区2区| 亚洲欧美日韩高清在线| 天堂va在线高清一区| 国产精品美女午夜爽爽| 久久久久国产精品一区三寸| 蜜臀久久久99精品久久久久久| 国产欧美高清视频在线| 久久精品观看| 日韩一区二区三区四区五区| 精品一区二区三区四区五区| 欧美不卡高清一区二区三区| 在线精品观看| 欧美aa在线视频| 欧美成人综合| 欧美日韩一区二区三区在线电影| 精品久久久网| 丝袜国产日韩另类美女| 精品一区二区三区中文字幕视频| 91九色精品国产一区二区| 国产亚洲欧美日韩在线观看一区二区| 亚洲精品福利电影| 日本一区二区三区中文字幕| 日本一区二区免费高清| 亚洲人成精品久久久| 国产精品福利在线观看播放| 午夜欧美精品久久久久久久| 国产日韩欧美在线播放不卡| 亚洲不卡av不卡一区二区| 欧美日韩一区二区高清| 婷婷精品视频| 欧美1区二区| 男人天堂欧美日韩| 国产一区二区三区国产精品| 亚洲久草在线| 久久久久久黄| 麻豆视频一区二区| 亚洲精品日韩久久| 亚洲一级黄色| 精品国产a一区二区三区v免费| 免费看的黄色欧美网站| 91日韩免费| 日本欧美一区| 免费精品视频| 激情久久婷婷| 天堂√中文最新版在线| 国产探花一区| 丝袜美腿高跟呻吟高潮一区| 久久久天天操| 最新中文字幕在线播放 | 亚洲三级视频| 国产91精品对白在线播放| 国产精品免费不| 日韩av不卡一区二区| 欧美在线网站| 日韩在线观看不卡| 精品美女久久| 久久午夜影院| 精品在线网站观看| 欧美国产不卡| 久久影院一区二区三区| 欧美日韩午夜| 日韩一区二区三区高清在线观看| 香蕉成人久久| 在线亚洲一区| 狠狠久久婷婷| 欧美成人久久| 欧洲激情综合| 亚洲香蕉网站| 日韩欧美午夜| 九九精品调教| 精品日韩视频| 欧洲av不卡| 色综合www| 激情六月综合| 99re国产精品| 国产精品人人爽人人做我的可爱| 国产亚洲精品v| 视频在线观看国产精品| 玖玖精品视频| 日本在线不卡视频| 国产亚洲一区二区三区不卡| 国产精品网站在线看| 麻豆国产欧美日韩综合精品二区| 欧美一级二区| 久久99青青| 黄色在线观看www| 视频二区不卡| 狠狠操综合网| 蜜臀av性久久久久蜜臀aⅴ四虎| 丝袜美腿亚洲色图| 日韩区一区二| 免费在线观看一区| 青青青免费在线视频| 久久精品高清| 日韩制服丝袜先锋影音| 97成人在线| 国产精品久久观看| 91精品1区| 久久xxxx| 婷婷成人av| 精品三区视频| 久久精品免费一区二区三区| 日韩一级不卡| 91精品国产自产观看在线| 久久亚洲人体| 欧美+亚洲+精品+三区| 在线日韩成人| 老牛国内精品亚洲成av人片 | 婷婷丁香综合| 日本精品另类| 麻豆视频久久| 欧美福利在线| 日韩综合一区二区| 国产精品一区二区精品视频观看 | 久久不卡国产精品一区二区| 日韩电影二区| 久久xxxx精品视频| 久久av导航| 欧美日韩国产一区二区三区不卡| 日韩精品a在线观看91| 国产一区不卡| 老司机久久99久久精品播放免费| 国产精品亚洲综合在线观看| 色乱码一区二区三区网站| 伊人久久亚洲热| 国产麻豆一区| 亚洲激情另类| 久久亚洲精品中文字幕| 在线亚洲观看| 久久尤物视频| 亚洲一区二区av| 日韩成人a**站| 日日夜夜免费精品视频| 桃色av一区二区| 91精品国产自产在线丝袜啪| 国产99久久久国产精品成人免费| 日韩av一区二| 亚洲欧洲一区| 国产精品22p| 羞羞答答国产精品www一本| 久久精品国产99国产| 久久亚洲一区| 欧美精选视频一区二区| 欧美一级二区| 99视频+国产日韩欧美| 精品视频97| 日韩av中文字幕一区二区 | 亚洲v在线看| 麻豆免费精品视频| 蜜臀av一区二区三区| 成人看片网站| 国产欧美午夜| 亚洲人成亚洲精品| 亚洲精品va| 日韩精品永久网址| 国产精品成人3p一区二区三区| 日韩专区一卡二卡| 国产精品88久久久久久| 日韩电影二区| 国产一区二区精品福利地址| 国产亚洲一区二区三区啪| 玖玖玖国产精品| 欧美日韩高清| 久久久久久美女精品| 国产福利电影在线播放| 欧美三级第一页| 日韩制服丝袜av| 日韩亚洲精品在线| 国产综合婷婷| 久久伦理在线| 日韩毛片视频| 中文在线а√天堂| 日韩成人精品一区二区| 欧美精品导航| 国产亚洲高清在线观看| 亚洲精品少妇| 免费成人性网站| 首页亚洲欧美制服丝腿| 国产精品美女久久久浪潮软件| 国产精品av久久久久久麻豆网| 欧美成人精品三级网站| 国产一区二区精品久| 色婷婷色综合| 狠狠躁少妇一区二区三区|