当前位置: 首页 > news >正文

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

消除异步的传染性

什么是异步的传染性

  • 异步函数具有传染性 比如一个函数中使用了 fetch 会导致调用他的函数也变成异步的.

如何消除传染性

  • 将fetch 变成同步函数.
  • 将fetch 返回的数据缓存起来
  • 隔离异步函数在 throw 中

消除的过程称为 代数效应:

  • 代数效应是一种方法, 可以"隔离函数中的副作用, 从而让函数变为纯函数"。
  • 从实现机制角度来说, 代数效应可以看作是一种执行控制, 函数可以在某个需要执行副作用的地方暂停,保存并跳出当前执行栈, 沿调用栈向上找到这个副作用对应的处理函数(handlers), 处理函数执行完毕, 再从之前暂停的地方继续执行。
  • react中的Suspense 就是利用了这个原理.
  • B站视频
  • React中的代数效应
    function getData() {const r = fetch('https://jsonplaceholder.typicode.com/posts', {method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify({title: 'foo',body: 'bar',userId: 1}),});console.log(r);}function run(func) {let oldFetch = window.fetch;let cache = {value: '',status: 'pending',};window.fetch = function(...args) {if(cache && cache.status === 'fulfilled') {return cache.value;} else if(cache.status === 'rejected') {throw cache.value;}else {const prom = oldFetch(...args).then((res) => {return res.json();}).then(res => {cache.value = res;cache.status = 'fulfilled';}).catch(err => {cache.value = err;cache.status = 'rejected';});throw prom;}}if(func) {try {func();}catch(err)  {if(err instanceof Promise) {err.then(func, func).finally(() => {window.fetch = oldFetch;});}}}}run(getData);```

相关文章:

  • ARINC818-1协议
  • 网易游戏 x Apache Doris:湖仓一体架构演进之路
  • 鸿蒙系统开发中路由使用详解
  • 【并行分布计算】Hadoop伪分布搭建
  • 【并行分布计算】Hadoop单机分布搭建
  • ubuntu docker 创建镜像 报错 dial tcp xxxx read udp xxxx i/o timeout 还有 Forbidden
  • 秘密任务 2.0:如何利用 WebSockets + DTOs 设计实时操作
  • Redis面试——常用命令
  • 【KWDB 创作者计划】_上位机知识篇---SDK
  • Python入门安装和语法基础
  • Ubuntu多用户VNC远程桌面环境搭建:从零开始的完整指南
  • java 设计模式之代理模式
  • [形象解析] ptmalloc、tcmalloc与jemalloc对比
  • PHP序列化/反序列化漏洞原理
  • 杂记-LeetCode中部分题思路详解与笔记-HOT100篇-其三
  • 告别定时任务!用Dagster监听器实现秒级数据响应自动化
  • [ComfyUI]重磅升级,FLUX.1-dev-ControlNet-Union-Pro-2.0发布,更好用了
  • Java对接Dify API接口完整指南
  • 吴恩达深度学习复盘(19)XGBoost简介|神经网络与决策树
  • openai发布今天发布了o3和o4-mini。
  • 专家:炎症性肠病发病率上升,需加强疾病早期诊断
  • 多名幼师殴打女童被行拘后续,盘锦市教育局工作人员:该局将专项整治全市幼儿园
  • 抖音开展“AI起号”专项治理,整治利用AI生成低俗猎奇视频等
  • 浙江广厦:诚挚道歉,涉事责任人交公安机关
  • 一女游客在稻城亚丁景区因高反去世,急救两个多小时未能恢复生命体征
  • 德州国资欲退出三东筑工,后者大股东系当地房企东海集团