【面试题】如何消除异步的传染性

如何消除异步 async 的传染性呢? 消除异步操作传染性的解决思路就是:抛出一个未决的 Promise,并利用调用方来监听这个 Promise 的完成状态,不直接在函数中处理 async 和 await。 阅读详情

背景

我们在开发过程中都知道,如果要使用async 和 await 语法糖必须在函数使用的链路上全部都要使用async 和 await, 不够优雅,那么有什么办法可以消除异步的传染性呢?

常见使用方式

const getdata = async () => {
	const res = await fetch(url).then( response=>console.log(response))
}

const fn1 = async () => {
	await getdata()
}

const fn2 = async () => {
	await fn1()
}

const fn3 = async () => {
	await fn2()
}

fn3()

消除异步传染性

那么如何消除异步的传染性呢? 思路: 很明显必须在源头进行处理, 否则在链路的任意一环处理都不可能消除, 那么如何处理呢? 在请求的时候会有延迟,那么只有将异步的动作同步化,然后增加缓存才能解决异步的传染性, 也就是使用抛出异常的方式来解决该问题

	function getdata() {
	 	return fetch('./data.json');
	}
	  function m1() {
	      return getdata();
	  }
	  function m2() {
	      return m1();
	  }
	  function m3() {
	      return m2();
	  }
	  function main() {
	      const data = m3();
	      console.log(data);
	  }
	function eliAsync(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;
			const prom = _originalFetch(...args).then(resp => resp.json()).then(res => {
				 result.status = 'fulfilled';
                 result.data = res;
			}, err => {
				reslut.status = 'rejected';
				result.err = err;
			});
			
			throw prom;
			
		}
			try {
				func();
			} catch(err) {
				if(err instanceof Promise) {
					const reRun = () => {
						i = 0;
						func();
					}
					err.then(reRun, reRun);
				}
			}
	};
eliAsync(fn3);
手把手教你入门vue+springboot开发(十九)--消除异步传染性 在异步编程中,异步传染性是个比较复杂的问题,"异步传染性"通常是指,当一个函数使用了async/await时,其调用者也必须使用async/await处理异步操作,这种情况可能导致代码变得复杂,不易维护。本篇重点研究一下如何消除异步传染性,可能解决这个问题本身对业务代码开发意义并不大,但是对框架设计却很重要,所以这些设计方法很值得我们学习借鉴,特别是大厂面试也可能涉及到。 阅读详情

相关推荐

C# 异步编程async/await

异步这个概念在不同语境下有不同的解释,比如在一个单核CPU里开启两个线程执行两个函数,通常认为这种调用是异步的,但对于CPU来说它是单核不可能同时运行两个函数,不过是由系统调度在不同的时间分片中执行。一般来说,如果两个工作能同时进行,就认为是异步的。在编程中,它通常代表函数的调用可以在不执行完的情况下返回,必要时在完成时回调。有一个概念常常被混淆,多线程和异步。

xxxzzzqqq_的博客 1489

消除异步函数的传染性简单实现

消除异步函数的传染性,通过重新定义异步函数,从而消除传染性

X_xiaoqi的博客 2073

通俗易懂的图解二叉搜索树、AVL树和红黑树

搜索是一种很常见的需求,当数据较多时,如何找到目标对象时,即需要搜索查找。 那么如何快速找到目标呢,最朴素的思想就是暴力查找,一个一个对比。 显然,当数据量增大时,我们需要优化查找方法获取更快的查找速度,我们可以通过维护一个有序数组,从而实现二分查找,查找速度从O(n)降为O(longn)。 但是数组并不便于插入和删除,链表便成为了最好的选择。 既然是采用二分查找,那么不如直接按照查找的步骤维护一种数据结构,于是二叉搜索树出现了。 二叉搜索树的性质为: 若左子树不为空,则左子树上所有节点值都小于根结点值;

暗色光的博客 758

消除异步任务的传染性

并通过缓存的方式来处理异步请求结果,从而在后续的调用中直接使用缓存的数据。目的:防止异步操作在代码中传播,影响到其他部分的执行。

weixin_51351053的博客 884

别再为10G UDP发愁了!手把手教你用Xilinx 10G/25G Ethernet Subsystem IP核搭建FPGA网络栈(附12套工程源码)

本文详细介绍了基于Xilinx UltraScale架构的FPGA网络栈开发,重点讲解了10G/25G Ethernet Subsystem IP核的应用实践。通过手把手教程和12套工程源码,帮助开发者解决10G UDP通信中的物理层接口、协议栈实现和系统集成等核心挑战,实现高性能FPGA网络栈搭建。

weixin_42522575的博客 364

Sentence-BERT 语义相似度双塔模型

论文介绍 发表:2019,EMNLP 论文题目:《Sentence-BERT:sentence embeddings using siaese BERT-networks》 论文地址:https://arxiv.org/abs/1908.10084 Github:https://github.com/UKPLab/sentence-transformers 适用领域: 句向量生成 语义相似度计算 语义搜索 无监督任务(聚类) 1 概述 在20年之前的各种预训练模型中,比如bert,XLNet,Alb

weiyaner的博客 9193

【前端】浅谈async/await异步传染性

"异步传染性"问题通常是指,当一个函数使用了async和await,其调用者也需要使用async和await处理异步操作,导致整个调用链都变成异步的。这种情况可能导致代码变得更复杂,不易维护。 类似于C# try catch的层层上抛,在某一层catch

欢迎指错||纠正||建议||水评+点赞&&评论&&关注&&转发 4061

Android Studio中把llama.cpp编译Android .so

本文介绍了一个在Android Studio中集成llama.cpp的最小Demo实现方案,通过JNI将llama.cpp编译为Android.so库,实现本地加载GGUF模型进行文本生成。文章详细说明了项目结构配置(SDK≥30,NDK≥28)、CMake编译设置、Kotlin-JNI-C++的完整调用链实现,以及模型文件部署方式。该Demo采用每次请求新建上下文的简化设计,包含加载模型、生成文本、资源释放等核心功能,并提供了错误排查建议。项目舍弃了上下文保持等复杂功能以确保稳定性,适合作为端侧大语言模型

Zhang Phil 514

js消除异步传染性

消除异步传染性

m0_47435082的博客 2421

【100%通过率】华为OD机试真题 Python 实现【网上商城优惠活动 / 模拟商场优惠打折II】

某网上商场举办优惠活动,发布了满减、打折、无门槛3种 优惠券,分别为: 1:每满100元优惠10元,无使用数限制,如100~199元可以使用1张减10元,200~299可使用2张减20元,以此类推; 2:92折券,1次限使用1张,如100元,则优惠后为92元, 3:无门槛5元优惠券,无使用数限制,直接减5元。

MISAYAONE的博客 9369

【推荐100个unity插件】动画重定向,快速在不同角色间共享动画,共用非人形Humanoid(泛型generic)动画——Retarget Pro

Retarget Pro是一款高效的Unity动画重定向工具,可快速在不同角色间共享动画。主要特点包括:1分钟快速设置,支持编辑器和运行时重定向;适用于人形、动物、武器等各类角色;提供基础重定向、IK重定向和FPS专用重定向三种功能模块;通过Rig组件和骨架资产实现骨骼链匹配,支持批量处理。插件包含示例项目和预设资源,操作简便且效果优于Unity原生Humanoid系统,特别适合处理手指等精细动画。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 545

实现消除异步传染性的理解

最近看到了渡一教育的消除异步性短视频,于是决定手动实现一下。然后确实自己写想不到还可以这样处理error。消除异步传染性的原理,就是将异步操作分离出纯函数,然后使用缓存获取异步结果。 完整代码在最后… 不过我觉得异步工作流的处理还是消息订阅与发布机制最泛用,特别是对于任务队列的实现😙 好处 纯函数易于测试和维护以及避免竞态条件的影响。按照这种思想来思考的话,纯函数中使用promise等异步函数就不对,使用了promise在函数中,要想直接获取异步结果就得使用async await。那么因此通过缓存或者全局

m0_66583360的博客 824

读懂 SAP S/4HANA 里的 SAP Fiori 架构:前端服务器、搜索链路、传统应用接入与内容组织全景解析

摘要:SAP Fiori架构并非简单的系统连接图,而是明确区分界面层与业务数据层的三层分工体系:用户交互层(浏览器与Fiori launchpad)、前端技术层(SAPUI5运行环境)和业务数据层(SAP S/4HANA后端)。这种分离实现了生命周期解耦,前端专注于统一体验治理,后端处理核心业务逻辑。值得注意的是,SAP Fiori front-end server本质仍是ABAP系统,负责UI技术组件运行。虽然SAP S/4HANA推荐嵌入式部署,但独立部署在多系统场景中仍有价值。典型Fiori应用通过O

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 179

异步函数传染性

在 JavaScript 中,异步函数的传染性指的是当一个函数内部包含异步操作(例如使用了 Promise、async/await 等)时,它会将异步特性传递给调用它的函数,以及调用它们的函数,依次传递下去。这可能会导致整个调用链上的函数都需要处理异步操作。在业务场景中为了解决这个问题,可以使用以下函数,其原理是:使用报异常的方式终止代码继续运行,在异常结束之后获取上吃抛异常时得到的接口请求数据重新执行一遍函数。由于针对的是纯函数,进参相同,结果也相同,所以无需担心执行后出现副作用。

selectDele的博客 1236

华为MetaERP的交易计税模块(即“税务引擎”)在设计上确实受到Oracle E-Business Tax(EBTax)等国际先进税务架构理念的影响,但结合了华为自身全球化运营、多准则合规、高并发处

华为MetaERP税务引擎在借鉴Oracle EBTax三层架构基础上,创新升级为五层智能税务架构,实现从"税码驱动"到"场景+规则+AI驱动"的转变。该模块采用云原生微服务架构,支持全球190+国家税务规则动态加载,具备实时计税、多准则并行处理、AI风险预警等核心能力,深度适配金税工程等国内合规要求。通过税务数字孪生、RPA机器人等创新,形成自主可控的智能税务中枢,为跨国企业提供全栈国产化税务解决方案,重新定义ERP税务管理范式。

金牌架构师 114

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

消除异步的传染性

【代码】消除异步的传染性。

402

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

消除异步的传染性(代数效应)

【代码】消除异步的传染性(代数效应)

shuxiaoxii的博客 427

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

js消除异步函数的传染性

摘要:消除异步函数的传染性 本文探讨了异步函数(async/await)的传染性问题及其解决方案。异步函数会破坏纯函数的特性,导致调用链上的函数都必须变为异步。通过重写fetch/axios请求方法并引入缓存机制,可以实现异步函数的"消除"。具体方法包括:1)保存原始方法;2)创建缓存状态管理系统;3)重写请求方法实现缓存逻辑;4)通过try-catch捕获Promise异常;5)最终恢复原始方法。这种技术在不污染纯函数的前提下,有效解决了异步传染性问题,适用于fetch和axios等多

weixin_45356397的博客 1343

消除前端异步的传染性

carcarrot的博客 235

异步传染性

在.NET 中,异步方法的“传染性”确实是一个值得关注的问题。它指的是异步方法调用的效果会在调用链上向上传递,导致一系列的方法也需要被标记为异步。

KoJuju的博客 545

JS消除异步传染性

消除异步传染性

大风起兮云飞扬 65

JavaScript异步问题解决方案

1. 前言 JavaScript是一门单线程语言,在执行一些比较耗时的操作(比如常见的Ajax请求)时,为了不阻塞后面代码的执行,往往需要执行异步操作。关于JS的运行机制,大家可以看阮一峰的这篇文章:JavaScript 运行机制详解:再谈Event Loop 如何处理异步操作在一直是个值得关注的问题,我会在这篇文章里介绍几种常见的处理异步函数的解决方案 2. 使用回调函数 如果你有使用过JQue...

十年代码写十年 575

C#异步编程 学习 十五: 编写异步函数

编写异步函数 对于任何异步函数,你可以使用Task 替代 void 作为返回类型,让该方法成为更有效的异步(可以进行await ) 并不需要在方法体中显示的返回Task 编译器会生成一个Task (当方法完成或者发生异常),这使得创建异步的调用链非常方便。 编译器会对返回Task 的异步函数进行拓展,使其成为当前发送信号或发生故障时使用TaskCompletionSource 来创建Task 的代码。 因此, 当返回Task的异步方法结束时候,执行就会跳回对他进行await 的地方。 using Sys

weixin_43542114的博客 1462

C#异步函数

原理 与同步函数相比,CLR在执行异步函数时有几个不同的特点: 1.        并非一次完成,而且分多次完成 2.        并非由同一个线程完成,而是线程池每次动态分配一个线程来处理; 结合这些特点,C#编译器将异步函数转换为一个状态机结构。这种结构能挂起和恢复。它的执行方式是一种工作流的方式。 执行步骤 1.        CLR创建一个状态机,这个状态机的操作数默认值为-

沉浸于此,成体系,求自由 1341

用最简单的例子讲解js中解决异步的方法

解决js异步的方法有很多中,今天就讲解一下如何解决js中的异步问题。 在讲解异步解决办法之前我们需要知道什么是异步。定时器、AJAX、事件绑定等都会引起js的异步行为,今天用js中的定时器为例来讲解,看下题。 考虑下题中输出的结果为: function getData() { setTimeout(function() { let name = '张三'; return name; }, 1000); } console.log(getData()); 这里就有很多人会说输

lancun_web的博客 2041

Async/Await 最佳实践

其实好久以前就看过这个文章,以及类似的很多篇文章。最近在和一个新同事的交流中发现原来对async的死锁理解不是很透彻,正好最近时间比较充裕就再当一回搬运工。 本文假定你对.NET Framework 4.5 的异步编程有基本的了解,相关的建议你能够在Stack Overflow, MSDN 以及async/awai FAQ中找到。这里并不试图想讲述多少新的知识点,而是想强调几点最佳实践,

代码搬运工 1952
上一篇: Nginx学习(docker部署及常用配置)
下一篇: SaaS简介
MaxLoongLvs
博客等级 码龄9年 226粉丝 170原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MaxLoongLvs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值