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

