inflight 源码解析

文章目录

  • inflight 源码解析
  • 正文
    • 0. 基本信息
    • 1. 源码解析
      • 1.0 源码结构
      • 1.1 主入口 inflight
      • 1.2 启动函数创建着 makeres
  • 其他资源
    • 参考连接
    • 阅读笔记参考

正文

0. 基本信息

  • version:v1.0.6
  • 功能:收集多个回调函数并返回只执行一次的启动函数,启动时一次调用多个回调

这个与 Promise 的想法有所不同,Promise 的概念是第一次调用就会尽可能的往后执行知道挂起,这个库实现的范式则是返回一个延迟启动的函数,有点像是 Rust 中的 Future 懒执行,只有执行 .await 才会开始动作一样

这种范式对于函数执行时机的把控是更好的

1. 源码解析

1.0 源码结构

  • inflight.js(阅读笔记:/inflight.js/0_structure.js
var wrappy = require('wrappy');
var reqs = Object.create(null);
var once = require('once');module.exports = wrappy(inflight);function inflight(key, cb) {}function makeres(key) {}function slice(args) {}

项目的主入口是使用 wrappy 包装的 inflight 函数

1.1 主入口 inflight

  • inflight.js(阅读笔记:/inflight.js/1_inflight.js
/* 加入队列 */
// if reqs[key] => 简单加入队列
// else         => 创建队列 & 返回启动函数
function inflight(key, cb) {if (reqs[key]) {reqs[key].push(cb);return null;} else {reqs[key] = [cb];return makeres(key);}
}

主入口是一个收集回调函数的方法,按 README 里面的演示,可以多次反复调用 inflight,但是只有第一次返回启动函数

1.2 启动函数创建着 makeres

  • inflight.js(阅读笔记:/inflight.js/1_inflight.js
/* 创建启动函数 */
function makeres(key) {// 只执行一次return once(function RES() {// 记录回调队列var cbs = reqs[key];var len = cbs.length;var args = slice(arguments);// XXX It's somewhat ambiguous whether a new callback added in this// pass should be queued for later execution if something in the// list of callbacks throws, or if it should just be discarded.// However, it's such an edge case that it hardly matters, and either// choice is likely as surprising as the other.// As it happens, we do go ahead and schedule it for later execution.try {// 执行回调for (var i = 0; i < len; i++) {cbs[i].apply(null, args);}} finally {if (cbs.length > len) {// 避免奇怪的人在执行回调的过程中加入新的函数// added more in the interim.// de-zalgo, just in case, but don't call again.cbs.splice(0, len);// 下个 tick 再执行剩余回调process.nextTick(function () {RES.apply(null, args);});} else {// 清理资源delete reqs[key];}}});
}

makeres 返回一个懒执行的启动函数 RES,启动函数里面就是调用所有回调,然后进行资源清理

其他资源

参考连接

Title Link
inflight - npm https://www.npmjs.com/package/inflight
npm/inflight - Github https://github.com/npm/inflight

阅读笔记参考

https://github.com/superfreeeee/Blog-code/tree/main/source_code_research/inflight-1.0.6

inflight 源码解析相关推荐

  1. 彻底理解OkHttp - OkHttp 源码解析及OkHttp的设计思想

    OkHttp 现在统治了Android的网络请求领域,最常用的框架是:Retrofit+okhttp.OkHttp的实现原理和设计思想是必须要了解的,读懂和理解流行的框架也是程序员进阶的必经之路,代码 ...

  2. Android开发神器:OkHttp框架源码解析

    前言 HTTP是我们交换数据和媒体流的现代应用网络,有效利用HTTP可以使我们节省带宽和更快地加载数据,Square公司开源的OkHttp网络请求是有效率的HTTP客户端.之前的知识面仅限于框架API ...

  3. [源码解析] 模型并行分布式训练Megatron (5) --Pipedream Flush

    [源码解析] 模型并行分布式训练Megatron (5) --Pipedream Flush 文章目录 [源码解析] 模型并行分布式训练Megatron (5) --Pipedream Flush 0 ...

  4. Android八门神器(一):OkHttp框架源码解析

    HTTP是我们交换数据和媒体流的现代应用网络,有效利用HTTP可以使我们节省带宽和更快地加载数据,Square公司开源的OkHttp网络请求是有效率的HTTP客户端.之前的知识面仅限于框架API的调用 ...

  5. Android八门神器(一): OkHttp框架源码解析

    HTTP是我们交换数据和媒体流的现代应用网络,有效利用HTTP可以使我们节省带宽和更快地加载数据,Square公司开源的OkHttp网络请求是有效率的HTTP客户端.之前的知识面仅限于框架API的调用 ...

  6. Android八门神器(一):OkHttp框架源码解析 1

    HTTP是我们交换数据和媒体流的现代应用网络,有效利用HTTP可以使我们节省带宽和更快地加载数据,Square公司开源的OkHttp网络请求是有效率的HTTP客户端.之前的知识面仅限于框架API的调用 ...

  7. kcp 介绍与源代码分析_KCP-GO源码解析

    原标题:KCP-GO源码解析 原文作者:张伯雨 golang技术社区 概念 ARQ:自动重传请求(Automatic Repeat-reQuest,ARQ)是OSI模型中数据链路层的错误纠正协议之一. ...

  8. OkHttp源码解析(上)

    导语 学过Android开发的同学都知道,我们使用网络请求获取服务器的数据时,通常使用的是封装好的Retrofit框架,这个框架很好的帮助我们对网络的发起,以及返回的数据进行操作,我们使用起来十分方便 ...

  9. OkHttp源码解析(很细 很长)

    前言 本文是对OkHttp开源库的一个详细解析,如果你觉得自己不够了解OkHttp,想进一步学习一下,相信本文对你会有所帮助. 本文包含了详细的请求流程分析.各大拦截器解读以及自己的一点反思总结,文章 ...

最新文章

  1. 电机驱动板测试:是否可以输出150kHz高频信号?
  2. 单片机c语言编程教学大纲,《单片机C语言编程》教学大纲
  3. CTFshow php特性 web115
  4. linux进入命令是什么,linux进入目录的命令是什么
  5. pjsua帮助手册(中文)
  6. mvc一对多模型表单的快速构建
  7. HDOJ 5071 Chat 模拟
  8. 随机样本一致性:一种用于图像分析和自动制图的模型拟合模型(3)--(P3P的迭代解)
  9. [转]阿里云配置mysql远程连接
  10. oracle adg维护,Oracle11gR2 Aactive DataGuard(手动)装配部署及维护文档(三)之升级及rman...
  11. Sql Server 内存相关计数器以及内存压力诊断
  12. think-cell 加载项在 Office 出现故障后消失,怎么解决?
  13. 卡尔曼滤波原理详解及系统模型建立(simulink)
  14. Electron 打包时下载 xxx-electron-v1.6.8-arch-x64.zip 文件出错
  15. Promise初步详解(resolve,reject,catch)
  16. 关于计算机的CPU的发展历史,计算机CPU的全部发展历史
  17. python bi_这5款BI工具,Python工程师最爱用
  18. 骑士数字外汇即将开启公测版,以科技领导数字金融发展!
  19. 《Learning to Reconstruct Botanical Trees from Single Images》学习从单幅图像重建植物树
  20. 大数据优化服务 黑科技创造价值 智慧旅游来势猛

热门文章

  1. Puppet 自动化运维
  2. 面对 2017 的轻狂和多疑
  3. mysql的触发器实验报告_数据库原理实验报告s11-数据库触发器的创建.doc
  4. 代理重加密(Proxy Re-encryption)
  5. D3.js有哪些比较好的中文视频教程
  6. [ 青涩的ASP ]ASP模式为什么失败
  7. 谈android界面设计
  8. 数据透视之——李白诗集
  9. html飞机翼布局,2.11 融会贯通:绘制喷气式飞机 - HTML5 Canvas 实战
  10. 测试矩阵是什么,小孩子都懂的,你该不会不知道吧