以fetch為例詳解如何消除js異步的傳染性
如何解決傳染性
在開發(fā)時候如果遇到一個函數(shù)需要調(diào)用內(nèi)部接口才能實(shí)現(xiàn)其函數(shù)功能,函數(shù)又依賴其他異步函數(shù)。則就會導(dǎo)致每個函數(shù)都變成了異步函數(shù)。如何解決這種傳染性?如下例子:
// 接口請求 async function getList() { return await fetch('/list.json').then(res => res.json()) } async function task1() { return await getList() } async function task2() { return await task1() } async function task3() { return await task2() } // 執(zhí)行task3。獲取到了getList的返回值 console.log(task3().then(res => console.log(res)));
從這里我們可以看到,由于getList是異步的,導(dǎo)致整個調(diào)用池都變成了異步。
那么有什么辦法能讓其消除此異步形式呢?
將所有的函數(shù)改造成同步函數(shù)。然后,自定義一個fetch,將報錯攔截再繼續(xù)調(diào)用自身異步函數(shù),如果返回正確值則就觸發(fā)其包含的下一步實(shí)現(xiàn)。
如下代碼:
function getList() { // 此處發(fā)送一個異步請求 return fetch('/list.json') } function task1() { return getList() } function task2() { return task1() } function task3() { return task2() } /* 我們先寫一個main函數(shù) */ function main() { const task3Run = task3() console.log(task3Run) } function run(fn) { /* 判斷是否為promise函數(shù) */ const cache = [] let i = 0 const _originalFetch = window.fetch window.fetch = (...args) => { /* 發(fā)送請求,且報錯 */ /* 判斷緩存如果存在,則交付緩存 */ if (cache[i]) { if (cache[i].status == 'fulfillled') { return cache[i].data } else if (cache[i].status == 'rejected') { throw cache[i].err } } const result = { status: 'pending', data: null, err: null } cache[i++] = result const prom = _originalFetch(...args) .then(res => res.json()) .then((resolve)=> { result.status = 'fulfillled' result.data = resolve }, (inject) => { result.status = 'rejected' result.err = inject }) // 報錯 throw prom } try { fn() } catch (err) { if (err instanceof Promise) { const reRun = () => { i = 0; fn() } err.then(reRun, reRun) } } } run(main)
以上就是以fetch為例詳解如何消除js異步的傳染性的詳細(xì)內(nèi)容,更多關(guān)于fetch消除js異步傳染性的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JS簡單實(shí)現(xiàn)動態(tài)添加HTML標(biāo)記的方法示例
這篇文章主要介紹了JS簡單實(shí)現(xiàn)動態(tài)添加HTML標(biāo)記的方法,結(jié)合實(shí)例形式分析了JavaScript使用createElement()方法針對頁面元素進(jìn)行動態(tài)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-04-04Ajax實(shí)現(xiàn)郵箱驗(yàn)證實(shí)例代碼
這篇文章介紹了Ajax實(shí)現(xiàn)郵箱驗(yàn)證的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-04-04javascript網(wǎng)頁隨機(jī)點(diǎn)名實(shí)現(xiàn)過程解析
這篇文章主要介紹了javascript實(shí)現(xiàn)網(wǎng)頁隨機(jī)變色及實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-10-10基于JS實(shí)現(xiàn)經(jīng)典的井字棋游戲
井字棋作為我們在上學(xué)時代必玩的一款連珠游戲,承載了很多人的童年記憶。本文我們就用HTML、css、js來實(shí)現(xiàn)一款井字棋游戲,感興趣的可以動手嘗試一下2022-04-04layui點(diǎn)擊左側(cè)導(dǎo)航欄,實(shí)現(xiàn)不刷新整個頁面,只刷新局部的方法
今天小編就為大家分享一篇layui點(diǎn)擊左側(cè)導(dǎo)航欄,實(shí)現(xiàn)不刷新整個頁面,只刷新局部的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09JS如何判斷瀏覽器類型和詳細(xì)區(qū)分IE各版本瀏覽器
本篇文章主要介紹了JS判斷瀏覽器類型和詳細(xì)區(qū)分IE各版本瀏覽器的代碼,非常具有實(shí)用價值,有興趣的可以了解一下。2017-03-03JavaScript實(shí)現(xiàn)外溢動態(tài)愛心的效果的示例代碼
這篇文章主要為大家介紹了如何利用JavaScript制作出簡單的外溢動態(tài)愛心的效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴快跟隨小編一起動手試一試2022-03-03