国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

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

JS如何為promise增加abort功能

瀏覽:112日期:2024-03-31 09:03:30
概述

Promise只有三種狀態:pending、resolve、reject,一個異步的承諾一旦發出,經歷等待(pending)后,最終只能為成功或者失敗,中途無法取消(abort)。

為promise提供abort功能的思路有兩種:

手動實現abort,觸發取消后,異步回來的數據直接丟棄(手動實現,比較穩妥) 使用原生方法AbortController中斷請求(實驗中的方法,有兼容性,ie不支持)

手動實現abort方法有兩種模式:都是依賴promise的接口間接實現

promise race方法

let PromiseWithAbort = function(promise){ let _abort = null; let Pabort = new Promise((res,rej)=>{ _abort = function(reason =’abort !’){console.warn(reason);rej(reason); } }); let race = Promise.race([promise,Pabort]); race.abort = _abort; console.log(promise,Pabort); return race; }let p1= new Promise(res=>{ setTimeout(()=>{ res(’p1 success’); },2000)})let testP = PromiseWithAbort(p1);testP.then(res=>{ console.log(’success:’,res);},error=>{ console.log(’error:’,error);})testP.abort();// 結果: reject: abort!重新包裝promise

class PromiseWithAbort { constructor(fn){ let _abort = null; let _p = new Promise((res,rej)=>{fn.call(null,res,rej);_abort = function(error=’abort’){ rej(error); } }) _p.abort = _abort; return _p; } } let testP = new PromiseWithAbort((res,rej)=>{ setTimeout(() => { res(1); },1000); }); testP.then(r=>{ console.log(’res:’,r); },r=>{ console.log(’rej:’,r); }); testP.abort();//結果: rej: abortAbortController 

(這是一個實驗中的功能,歸屬于DOM規范,此功能某些瀏覽器尚在開發中)AbortController接口代表一個控制器對象,允許你在需要時中止一個或多個DOM請求。

// 中斷fetch請求 let controller = new AbortController(); let signal = controller.signal; fetch(’https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise/finally’,{signal}).then(r=>{ console.log(r); }); controller.abort();//結果: Uncaught (in promise) DOMException: The user aborted a request.//中斷一個promiseclass PromiseWithAbortController { constructor(fn,{signal}){ if(signal && signal.aborted){ return Promise.reject(new DOMException(’Aborted’,’AbortError’)); } let _p = new Promise((resolve,reject)=>{ fn.call(null,resolve,reject); if(signal){signal.addEventListener(’abort’,()=>{ reject(new DOMException(’Aborted’,’AbortError’));}) } }); return _p; }}let controller = new AbortController(); let signal = controller.signal;let testP2 = new PromiseWithAbortController((r,j)=>{ setTimeout(() => { r(’success’); }, 1000);},{signal});testP2.then(r=>{ console.log(’res:’,r); },r=>{ console.log(’rej:’,r); }); controller.abort(); // 結果: rej: DOMException: AbortedAxios插件自帶取消功能

//1.使用source的tokenconst CancelToken = axios.CancelToken;const source = CancelToken.source();axios.get(’/user/12345’, { cancelToken: source.token}).catch(function (thrown) { if (axios.isCancel(thrown)) { console.log(’Request canceled’, thrown.message); } else { // handle error }});axios.post(’/user/12345’, { name: ’new name’}, { cancelToken: source.token})// cancel the request (the message parameter is optional)source.cancel(’Operation canceled by the user.’);//2. 通過傳出的functionconst CancelToken = axios.CancelToken;let cancel;axios.get(’/user/12345’, { cancelToken: new CancelToken(function executor(c) { // An executor function receives a cancel function as a parameter cancel = c; })});// cancel the requestcancel();//主要:使用相同token的請求可以一并取消

在現在項目中使用最頻繁的是axios,所以取消請求不用擔心。dom規范的AbortController,由于兼容性,不推薦使用。如果需要自己動手實現的話,還是文章前兩種方法較穩妥(promise race方法和重新包裝promise方法)。

以上就是JS為promise增加abort功能的詳細內容,更多關于JS的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 亚洲欧美日韩综合一区久久 | 日韩欧美一区二区三区不卡在线 | 欧美在线视频免费观看 | 久久久久毛片免费观看 | 看色网站| 99精品视频在线在线视频观看 | 日本亚洲成高清一区二区三区 | 亚洲精品影院一区二区 | 亚洲欧美久久一区二区 | 国产精品国产精品国产三级普 | 欧美成人看片一区二区三区尤物 | 欧美国产在线看 | 成人毛片免费观看视频大全 | 国产精品国产三级国产an不卡 | 天堂mv亚洲mv在线播放9蜜 | 国产精品99r8在线观看 | 无码免费一区二区三区免费播放 | 日韩美女在线看免费观看 | 99精品高清不卡在线观看 | 美女被免费网站在线视频软件 | 亚洲日本高清影院毛片 | 日韩欧美一区二区三区在线观看 | 国产成人久久久精品毛片 | 日本农村寡妇一级毛片 | 亚洲国产精品看片在线观看 | 国产三级精品最新在线 | 亚洲一区二区三区中文字幕 | 欧美3p精品三区 | 久草在线资源 | 欧美视频区 | 爱啪网亚洲第一福利网站 | 国产精品视频第一区二区三区 | 欧美色穴 | 日本在线亚州精品视频在线 | 亚洲国产日韩欧美综合久久 | 美女操穴视频 | 中文字幕日韩精品亚洲七区 | 欧美xxxxxxxx | 久久精品免费一区二区三区 | 97超级碰碰碰免费公开在线观看 | 久久综合久久美利坚合众国 |