位置: 编程技术 - 正文

JavaScript 链式结构序列化详解(js链式编程的原理)

编辑:rootadmin

推荐整理分享JavaScript 链式结构序列化详解(js链式编程的原理),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:js链式写法,链式操作是jquery代码的风格之一,js如何实现链式调用,js链式写法,js如何实现链式调用,js链式操作,js链式函数,js链式写法,内容如对您有帮助,希望把文章链接给更多的朋友!

一、概述

在JavaScript中,链式模式代码,太多太多,如下:

if_else:

switch:

疑问:诸如上述这些链式代码,倘若,我们想将其扁平化链式处理呢?如下:

//fn1,f2,f3为处理函数_if(fn1)._elseIf(fn2)._else(fn3);

下面我们就来一起尝试实现下呗。

二、链式代码扁平化

假如,现在我们有如下链式代码:

好了,现在我们一步一步将其"扁平化"。

其实看看上面的代码,不难发现,if…else这种格式,其实就是数据结构中的单链表,那么,初步利用JavaScript实现单链表,如下:

其中f1,f2,f3为判断函数,并且我们假设,如果诸如f1、f2、f3返回'next'时,就继续往下查找,否则,停止往下查找。如下:

好了,这就是链表的模式。

但是,我们的最终目的是想实现如下这样的呢?

//fn1,f2,f3为处理函数_if(fn1)._elseIf(fn2)._else(fn3);

你可能会说,将上述代码改成如下这样,不就好了吗?!!

thens.push(f1).push(f2).push(f3).resolve();

But,JavaScript的push方法返回的是数组的新长度,而不是数组对象哦。

So,那我们只能新写一个add方法,效果和push一样,但是返回数组对象。如下:

测试代码如下:

但是,这样有个缺点,我们是将add、resolve方法绑定在全局变量thens中的,总不能每次创建一个数组时,都复制粘贴一遍方法吧,所以重构代码如下:

显然,add,resolve这种公共方法,在每次实例化时,都创建一遍是不科学的,so,利用prototype在原有的基础上继续变形,如下:

测试代码如下:

JavaScript 链式结构序列化详解(js链式编程的原理)

var thens = new Slink();thens.add(f1).add(f2).add(f3);thens.resolve();

不错,但是这样,我们每次都得手动new一个Slink,有点麻烦,所以,我们将new Slink这个过程,封装到函数中,如同jQuery一样,如下:

测试代码如下:

$go(f1).add(f2).add(f3).resolve();

好了,大功告成,接下来就是语法糖滴问题咯,整理代码如下:

测试代码如下:

_if(f1)._elseIf(f2)._else(f3).resolve();

当然,除开利用数组这种方式,还可以利用闭包,实现链式扁平化效果,如下:

测试代码如下:

三、异步代码链式扁平化

在上面我们讨论的都是同步过程,倘若,链式调用函数中有异步情况呢?

什么意思?如下:

我们将f1利用setTimeout变成了异步,按照上述代码的逻辑,应该是等f1完全执行完毕(包括setTimeout执行)后,判断是否执行f2,但真的如此吗?

测试代码如下:

_if(f1)._elseIf(f2)._else(f3).resolve();

执行代码的结果就是,什么也不输出。

Why?

因为JavaScript是单线程嘛。详情见(here)

那该怎么解决呢?

由于有异步代码,且必须在异步代码后处理后续的链,那么我们就等待异步代码执行完毕后,才执行后续的链嘛,如下:

好了,由于在函数中,我们使用了this,其代表Slink对象,且改变了resolve方法,固,需细微调整Slink构造函数和原型链,如下:

测试代码如下:

哈哈,如果你了解Promise,是不是感觉这么相似呢。

是的,宗旨都一样,达到异步代码扁平化目的,不过这里的代码比Promise要简约得多啦。关于Promise详情见(here)。

感谢阅读此文,希望能帮助到大家,谢谢大家对本站的支持!

js基本算法:冒泡排序,二分查找的简单实例 知识扩充:时间复杂度:算法的时间复杂度是一个函数,描述了算法的运行时间。时间复杂度越低,效率越高。自我理解:一个算法,运行了几次时间

javaScript 事件绑定、事件冒泡、事件捕获和事件执行顺序整理总结 抽空学习了下javascript和jquery的事件设计,收获颇大,总结此贴,和大家分享。(一)事件绑定的几种方式javascript给DOM绑定事件处理函数总的来说有2种方式

Javascript 事件冒泡机制详细介绍 1.事件在浏览器客户端应用平台,基本生都是以事件驱动的,即某个事件发生,然后做出相应的动作。浏览器的事件表示的是某些事情发生的信号。事件

标签: js链式编程的原理

本文链接地址:https://www.jiuchutong.com/biancheng/373601.html 转载请保留说明!

上一篇:javascript的几种写法总结(javascript有哪些类型)

下一篇:js基本算法:冒泡排序,二分查找的简单实例(js中的冒泡排序原理)

  • 发票章是否需要到税务局备案
  • 税收法律关系是指国家与纳税人之间
  • 结转代扣社会保险费分录
  • 装卸搬运服务属于什么税目
  • 财务报表中负债率怎么算
  • 营业执照经营范围增项如何办理
  • 跨区税源登记是指
  • 小规模纳税人报销会计分录
  • 增值税降到16个点什么时候实行
  • 外商独资企业在分配利润时是否扣缴个税
  • 专票金额和实际报销金额不符
  • 企业认缴出资怎么做账
  • 企业营改增后的会计处理有何变化
  • 没有真实业务的票据贴现
  • 单位给员工交社保怎么交怎么计算
  • 公益捐赠税前扣除政策
  • 仓储费怎么账务处理
  • 公司购买模具的会计科目
  • 一般贸易和进料加工的区别是什么
  • 核定征收个体户怎么报税
  • 打开网页时显示无法获取属性
  • 王者荣耀中吕布的克星
  • 利润表中哪些属于营业外收入
  • 任务栏音量图标点击无反应
  • PHP:xml_get_error_code()的用法_XML解析器函数
  • 土地增值税清算管理规程
  • regsrv.exe - regsrv是什么进程 有什么用
  • lsass.exe是什么进程
  • 项目优化管理工具
  • 对外支付企业所得税计税依据
  • php写一个简单的单例模式
  • 外贸企业退运后的进项税如何处理
  • 编制记账凭证出现错误
  • 布拉格下雪
  • 社保挂靠公司收费标准是怎样的
  • 鹅卵石镇宅
  • 办理组织机构代码证需要什么材料
  • 工程竣工决算会计账务处理
  • python单链表的创建
  • 车辆保险会计怎么做分录
  • 企业转让时应收账款如何处理
  • 软件服务费可以全额抵扣吗?
  • 作废发票要不回来了怎么办
  • 个人取得劳务报酬个人所得税
  • 固定资产减少如何处理
  • 公司为非本单位缴纳社保
  • 其他综合收益转入盈余公积和未分配利润
  • 怎么做掉公司账面库存100万
  • 固定资产抵扣影响税负
  • 微信支付的账务在哪里
  • 应补税额是要交钱
  • 个人开具发票需要税号吗?
  • 一般纳税人印花税税率是多少
  • 查看sqlserver操作记录
  • mysql登陆error2002
  • mac怎么卸载第三方软件
  • 阿里云电脑系统
  • gsicon.exe是什么进程 作用是什么 gsicon进程查询
  • window8设置在哪里
  • 重装win7系统后屏幕变小了
  • 在linux系统中拥有
  • Win10桌面版红石预览版14295更新(修复)、已知问题及解决方案汇总
  • Android游戏开发案例教程小小弹球
  • python字符串常用方法
  • 局域网如何打开共享文件夹
  • 命令行输入以下哪个命令可以画出样条曲线
  • unity地形少了三个键
  • sockaddr_in和sockaddr
  • js点击
  • HttpURLConnection的流式输出的缺陷和解决方法
  • js跨域的几种方法
  • 怎样编?
  • code encode的区别
  • js的文件可以直接预览吗
  • jquery筛选器
  • 湖南税务发票查验平台官网
  • 云南人社医保缴费步骤
  • 超市一般纳税人做账流程
  • 河南地税申报表怎么填
  • 销货清单表格的制作方法
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设