视频:消除异步的传染性 #JavaSc… #编程 # – 抖音.mp4 https://www.aliyundrive.com/s/TmxFUmBNc6v 点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。
抛出异常+捕获异常实现同步等待请求结束 实现摆脱异步传染性。

async function getUser() {
return await fetch('http://my-json-server.typicode.com/typicode/demo/profile')
.then(resp => resp.json())
}
async function m1() {
return await getUser()
}
async function m2() {
return await m1()
}
async function m3() {
return await m2()
}
将如上代码删除asunc/await并实现基本的调用逻辑不变。
function getUser() {
return fetch('http://my-json-server.typicode.com/typicode/demo/profile')
}
function m1() {
console.log(1);
return getUser()
}
function m2() {
console.log(2);
return m1()
}
function m3() {
console.log(3);
return m2()
}
m3()
function run(func) {
let cache = [];
let i = 0;
const _originalFetch = window.fetch
window.fetch = (...args) => {
if (cache[i]) {
// 交付缓存
if (cache[i].status === 'fulfilled') {
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
// 发送请求
let prom = _originalFetch(...args).then((resp) => {
result.status = 'fulfilled';
console.log("这里拿到了值",resp);
result.data = resp;
}, (err) => {
result.status = 'rejected'
result.err = err;
})
// 报错
throw prom
}
try {
func()
} catch (err) {
if (err instanceof Promise) {
const reRun = () => {
i = 0;
func()
}
err.then(reRun, reRun)
}
}
}