js回调流程控制, 更高级, 更优雅
第一次发文, 仅纪念我开源的第一个npm包esdese
始于回调
早期的时候, 用jquery的ajax都是一层套一层, 2层的时候倒还好, 一旦多了就比较麻烦了.
后来使用了promise, 虽然说好了一些, 但是有些时候还是层级比较深. 很难受
上个月的时候, 正好有个小程序的项目, 我就把授权的流程整理了一遍, 就发现这样的一个问题
var checkNet = function(){//检查网络//...
}
var getSetting = function(){//获取权限//...
}
//...
var getToken = function(){//获取token//...
}
复制代码
一写下来发现方法接近10个, 我想把这些方法都整合起来, 但是好多都是前后依赖的关系, promise.all解决不了, 处理起来很麻烦, 索性就写了一个递归处理
var process = function(list){return new Promise((resolve, reject) => {if(list[0]){list[0]().then(res => {if(list.length == 1 ){resolve();}else{process(list.slice(1)).then(res => resolve(), _ => reject())}}, _ => reject())}});
}
process([checkNet, getSetting,'...', getToken]).then(res => {///...
})
复制代码
功能比较单一, 只能解决当前问题
前段时间看到一本js书(JavaScript异步编程)上提到一个库, 引起了我的兴趣
叫做step, 观察了一番源码之后, 发现它的实现方法很巧妙, 但是可惜只能在node.js上跑
以下是它的核心代码:
function step(){var steps = Array.prototype.slice.call(arguments);function next(){//...var fn = steps.shift();//...var result = fn.apply(next, arguments);//...}//...
}
复制代码
使用起来就像这样子:
step(function(){setTimeout(this, 20000);},function(){console.log('sucesss');}
)
复制代码
2秒后输出success, 我个人是非常喜欢这种调用方式的.
但是当时没有自己写一个库的想法(手动狗头).
直到几天前, 看了vue的早期版本实现(尤大佬流弊), 就想自己写一个试一下, 虽然知道大致的原理, 但是光说不练假把式
动手了之后就发现这样的一个东西:
[].forEach.call(eles, el => {[].forEach.call(el.attributes, attr => {console.dir(attr);//...});
});
复制代码
我一看到这样格式就觉得很僵硬, 虽然能提出去变成方法, 但这本不是我想要的样子
灵光一闪, 我能不能把step用进来, 说做就做, 但是一用发现了问题:
step(function(){[1, 2, 3].forEach(this);},function(i){console.log('i:', i);}
)
复制代码
结果只输出了1
因为传进去的方法被shift掉了, 只能执行一次
还有err优先的原则导致一个参数是错误描述
this.gruop也不能满足当前需求. 于是我就想自己写一个类似的库来处理循环的流程.
esdese
一番操作之后, 还真我被搞出来了:
var esdese = function(){var fns = [].slice.call(arguments);var next = function(i){i ++;return function(){fns[i].apply(next(i), arguments);}}next(-1)();
}
复制代码
这是最开始的版本, 跟step一样精简, 但是实现思路确实不太一样, 结合一个例子看看:
esdese(function(){[1, 2, 3].forEach(this);},function(i){console.log('i:', i);},function(){console.log('success');}
)
//console.log
//1: 1
//success
//1: 2
//success
//1: 3
//success
复制代码
当然也能满足普通的异步流程
esdese(function(){setTimeout(this, 20000);},function(){console.log('success');}
)
复制代码
也有其他的一些用法, 扩展了类似step的group方法, github 你可以猛戳前往观察
当前function的所有group执行完毕, 才会执行下个方法, 也就是分组并行处理, 如下:
esdese(function(){var group = this.group();//1: group has name// setTimeout(group('a'), 2000);// setTimeout(group('b'), 2000);for(var i = 0; i < 3; i ++){//2: group no name //3: group has namesetTimeout(group(/*'time'*/).param(i), 1000 * i);}},function(a, b, c){console.log(a, b, c);//1: { a: undefined, b: undefined } undefined undefined//2: 0 1 2//3: { time: [ 0, 1, 2 ] } undefined undefined}
)
复制代码
param方法就是封装了bind方法, 传递一个参数过去, this 和 group都可以调用
增加了一个内部存储对象 this.data, 前面保存的在后面可以使用
使用了esdese之后, 早期版本的vue也写出来了, 当然不是完全版的 test
why
至此文章就要结束了.
关于为什么叫esdese, 初一看确实绕口, 什么es什么的
但是了解的人就知道这是什么, 没错
艾斯德斯 高贵.优雅又强大
end
转载于:https://juejin.im/post/5cb140ddf265da03981fb6dd
js回调流程控制, 更高级, 更优雅相关推荐
- 【 js基础 Day2】js的流程控制:分支语句,循环.顺序结构
复习 JavaScript简称为JS JavaScript是什么? 是一门脚本语言:不需要编译,直接运行 是一门解释性的语言:遇到一样代码就解释一行代码 C#语言是一门面向对象的语言,也是编译语言,是 ...
- JS三板斧——流程控制
JS三板斧--流程控制 1.判断语句 前言:在js中判断语句的存在是非常广泛的,我们可以根据判断条件的数目选择合适的判断语句,条件比较少时,使用if/else if/else,条件比较多时用switc ...
- 02 . JS 运算符 + 流程控制
算数运算符 ------------------------------------- console.log(1 + 1); // 2console.log(1 - 1); // 0console. ...
- MVEL快速入门—MVEL流程控制和高级功能(三)
之前文章 MVEL快速入门-MVEL基础语法讲解(一) MVEL快速入门-MVEL属性和文字讲解(二) 流程控制 实际上MVEL的表达形式不仅仅局限于简单的表达式,他还支持流程控制.使我们能够执行高级 ...
- EventFlow.helper.js 事件流程控制
/*!* 事件流程管理* version: 1.0.0-2018.07.25* Requires ES6* Copyright (c) 2018 Tiac* http://www.cnblogs.co ...
- js的 流程控制(笔记)
分支结构 /* if的语法结构if (表达式){执行语句} *//* 2.执行思路 如果if里面的表达式结果为真 true 者执行大括号里面的执行语句3.要是表达式的语句为假 者不执行大括号里面的语句 ...
- JavaScript异步流程控制的前世今生
js的流程控制老大难问题就是异步回调. 一个流程过程,往往会出现回调地狱,这个回调异步控制就被提上研究得议程. 目前有实现的回调流程有以下几种 回调函数实现 事件监听 发布订阅 Promise/A+ ...
- JS:2.1,流程控制(if,switch)高级
ylbtech-流程控制:流程控制(if,switch)高级 if语句 if if-else if-else_if-else switch JS:2.1.0,if语句返回顶部 If 语句 如果希望指定 ...
- Node.js 模块之Nimble流程控制
NodeJS异步的特性有时候会导致程序非常的难看,回调一层套着一层,这个时候就要用流程控制模块来控制究竟是同步还是异步了. Nimble是一个轻量.可移植的函数式流程控制模块.经过最小化和压缩后只有8 ...
最新文章
- 自定义报错返回_Keras编写自定义层--以GroupNormalization为例
- 从民工到CCNA-献给想考认证的朋友
- Web服务器性能/压力测试工具http_load、webbench、ab、Siege使用教程
- 成功案例_网络营销成功案例分析
- Angular CLI版本问题(Your global Angular CLI version (12.2.7) is greater than your local version (9.0.3))
- Altium Designer -- PCB设置板框
- DUMP文件分析6:简单的堆破坏示例
- python执行批处理文件_如何从Python中执行批处理文件,从而改变调用进程的环境?...
- (99)利用任务task实现单字节乘法功能,面试必问(二十三)(第20天)
- taobao-pamirs-schedule-2.0源码分析——任务队列分配源码分析
- php.ini添加的变量读取,php用ini_get获取php.ini里变量值的方法
- PHP抖音无水印解析视频代码+思路
- Python数据分析案例——20年【科比NBA】生涯|数据分析
- CSRF跨站请求伪造漏洞修复方案
- 时尚达人玩转短裤短裙凉鞋搭配
- Unity Visual Effect Graph 制作Fireworks烟花特效
- 省赛前的做题计划记录
- PostgreSQL重启恢复---XLOG 2.0
- aptx与ldac音质区别_蓝牙协议LDAC和aptx的区别?
- 使用思维导图的甘特图进行项目排期
热门文章
- 同学我看你答题分钱总被淘汰你得充充电了!
- 盘点 | 2017 年 关于 Python 的 13 件大事
- 冠军奖30万!刘强东搞了个“猪脸识别”比赛,中美两地同时启动(附比赛详细日程及赛题说明)
- Redis 缓存击穿(失效)、缓存穿透、缓存雪崩怎么解决?
- 一份来自贾扬清的AI修炼指南:不存在算法工程师,调参侠没有市场
- 基于深度学习的文本分类应用!
- 万引大佬自曝这样被MIT拒掉:“系里不喜欢你”,找校长对峙后悟了
- 双非山东科技胜过吉大,湖南大学超哈工大,US News2022世界大学排行榜引热议...
- 10月1日之后,你新建的GitHub库默认分支不叫「master」了
- CBNet和DetectoRS:COCO数据集霸榜模型