视频:消除异步的传染性 #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)
					}
				}
			}

作者 译文

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注