原文链接:https://zhuanlan.zhihu.com/p/90660704 作者:shud.in

数据依赖关系其实是一个 DAG(有向无环图)。有些数据依赖于其他,有的则无依赖性:

DAG:

对数据的请求则是对这个有向无环图的遍历。最高效的请求方式一定是在拓扑序上尽可能地并行(每当一个数据的依赖都就绪时,立即发起请求)。

仔细想想,大部分时候(请求并不复杂时),我们都用 Promise.all 来描述这个 DAG。举例来说:

Promise.all([fetchA(), fetchB()]).then([a, b] => fetchC(a, b))

有 A,B,C 三个资源,C 依赖 A 与 B 的结果,那么我们偶尔会写如上代码。实际上描述了如下 DAG:

但是当依赖复杂起来……例如:

有 A,B,C,D 四个资源,C 依赖 A,D 依赖 B 与 C……最并行的写法可能是这样的:


(以上假设在 React 中,我们需要尽快渲染 A,B,C,D)

是不是非常头疼(飞面神教流 React 写法)?可以当笔试题了。

但在 SWR 中,你只需要这么写:

依然满足了最大的并行性,与上面完全等价。只需要描述 DAG 中,每一个点的被指向边即可(数据依赖)。

SWR 是如何做到这一点的呢?

这里有一个解释:每次渲染的时候,SWR 会试着执行 key 函数(例如 ()=> '/api/c?a=' + A.id),如果这个函数抛出异常,那么就意味着它的依赖还没有就绪(A === undefined),SWR 将暂停这个数据的请求。在任一数据完成加载时,由于 setState 触发重渲染,上述 Hooks 会被重选执行一遍(再次检查数据依赖是否就绪),然后对就绪的数据发起新的一轮请求。

(以上翻译自 https://twitter.com/shuding_/status/1189607308931653632)

题外话

最近推特上有许多关于 fetch-as-you-render 的讨论,许多人陷入了对模式本身的争论中。

但这篇文章确实提出 fetch-as-you-render 一个非常大的优势(尽可能避免了 waterfall)。对于 waterfall,包括 React Suspense 也没有很好的方案建议:https://reactjs.org/docs/concurrent-mode-suspense.html#for-library-authors 。

另外对于 fetch-as-you-render 的弱势(需要在渲染时才能开始加载数据),ZEIT 的解决办法是配合 Next.js,对第一轮数据(无其他依赖)自动生成并插入 <link link rel=preload> 标签,改进效果非常明显(https://twitter.com/rauchg/status/1189277551321079810)。

SWR 与前端数据依赖请求相关推荐

  1. Spring Boot + Vue 前后端分离开发,前端网络请求封装与配置

    前端网络访问,主流方案就是 Ajax,Vue 也不例外,在 Vue2.0 之前,网络访问较多的采用 vue-resources,Vue2.0 之后,官方不再建议使用 vue-resources ,这个 ...

  2. 前端发起请求,后端响应请求的整个过程

    文章目录 前端 注册页面 axios 请求方法 URL 路径配置 自定义 axios 方法封装 后端 创建服务器模块 接口方法模块 连接数据库 本文分为:前端.后端两部分讲诉.以下是前端发送请求到服务 ...

  3. 前端异步请求解决方案

    前端异步请求解决方案 前言 一.回调函数 二.promise对象 三.async await 前言 JavaScript是一门单线程的语言,同一时间节点只能做一个任务,默认是从前往后一次执行. 同步任 ...

  4. 前端post请求报400错误

    前端post请求报400错误 发布时间: 2019-06-05 18:28:54 400的错误是由于发送请求参数没有成功 原因:参数名称类型没有对上:或者参数格式不正确 参数格式不正确,解决方法:格式 ...

  5. 前端发送请求到后端报400错误问题

    一般情况下,前端发送请求到后端,报400是由于前后端json对象中的属性名与后端接收请求的实体类的属性名不对应(完全相同)引起的.排除400错误的方法如下: 1.前端发送的属性名和后端实体类的属性名不 ...

  6. 前端get请求接收后端传来的二进制文件流blob实现下载功能,解决下载文件打不开问题

    解决方法:         前端在请求下载文件接口时,要设置responseType为blob. 前端代码: export function download(url, params) {return ...

  7. 前端异步请求数据未获取导致报错解决办法

    我们在编写前端程序的时候,往往需要异步请求后端数据,然后拿着得到的数据重现渲染页面.有的时候,数据还没有获取到,这个时候会是undefined形式.比如说,let test = "123&q ...

  8. Nginx映射本地json文件,配置解决浏览器跨域问题,提供前端get请求模拟数据

    场景 网络接口返回json格式数据,可以直接在浏览器中访问. 可以在页面上右键另存为json格式文件 怎样在本地使用nginx配置,模拟get接口返回该json文件,使前端使用ajax请求数据时,可以 ...

  9. promise的状态以及api介绍_前端 api 请求缓存

    作者:wsafight https://github.com/wsafight/personBlog/issues/2 web开发时,性能都是必不可少的话题.对于webpack打包的单页面应用程序而言 ...

最新文章

  1. GitHub的这个彩蛋我居然才知道,我OUT了
  2. 软件著作权登记证书申请攻略
  3. docker部署项目 入门版
  4. C语言从0到1·变量
  5. SpringBoot - 实践阿里巴巴【Manager 层_通用业务处理层】
  6. JMM中有哪些方法建立happen-before规则
  7. [libuv] libuv学习
  8. UI素材模板|网站后台管理的表单可临摹优秀模板
  9. html的table属性笔记
  10. DaveGray推荐的视觉思维好书(一)
  11. 嵌入式系统硬件原理设计与审核
  12. n个人看了这个故事之后精神分裂了(ZT)
  13. HG255D 刷机备忘
  14. 大数据hadoop学习【9】-----通过JAVA语言编程,实现对Hbase数据库表及数据的相关操作
  15. 通达信 移动平均算法_高德网络定位算法的演进
  16. 【信息汇总】北京航空航天大学计算机考研
  17. Slove the {Failed to load unit 'HGCM' (VERR_INVALID_PARAMETER)}
  18. 企业微信 1.3.5、多了个同事吧
  19. 隐藏高德地图左下角LOGO
  20. 注塑机摆放间距多少合适_注塑机一般的说法比如多少多少g,对应的型号,拉杆间距,锁模力的对应表谁能给我张...

热门文章

  1. 小牛采购管理系统 v3.01 bt
  2. MySQL完美卸载-奇怪的小知识
  3. vue之axios封装
  4. 简述python在量化金融中应用_Python金融量化
  5. 安全管家2012上半年手机安全分析报告
  6. 欧几里得算法 辗转相除法 C语言
  7. C语言——PTA 埃尔米特多项式
  8. java递归处理单位人员组织机构树
  9. (十)Scratch制作《贪吃蛇》,超详细
  10. 【CPU毫秒级】网易易盾点选识别