第一次发文, 仅纪念我开源的第一个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回调流程控制, 更高级, 更优雅相关推荐

  1. 【 js基础 Day2】js的流程控制:分支语句,循环.顺序结构

    复习 JavaScript简称为JS JavaScript是什么? 是一门脚本语言:不需要编译,直接运行 是一门解释性的语言:遇到一样代码就解释一行代码 C#语言是一门面向对象的语言,也是编译语言,是 ...

  2. JS三板斧——流程控制

    JS三板斧--流程控制 1.判断语句 前言:在js中判断语句的存在是非常广泛的,我们可以根据判断条件的数目选择合适的判断语句,条件比较少时,使用if/else if/else,条件比较多时用switc ...

  3. 02 . JS 运算符 + 流程控制

    算数运算符 ------------------------------------- console.log(1 + 1); // 2console.log(1 - 1); // 0console. ...

  4. MVEL快速入门—MVEL流程控制和高级功能(三)

    之前文章 MVEL快速入门-MVEL基础语法讲解(一) MVEL快速入门-MVEL属性和文字讲解(二) 流程控制 实际上MVEL的表达形式不仅仅局限于简单的表达式,他还支持流程控制.使我们能够执行高级 ...

  5. EventFlow.helper.js 事件流程控制

    /*!* 事件流程管理* version: 1.0.0-2018.07.25* Requires ES6* Copyright (c) 2018 Tiac* http://www.cnblogs.co ...

  6. js的 流程控制(笔记)

    分支结构 /* if的语法结构if (表达式){执行语句} *//* 2.执行思路 如果if里面的表达式结果为真 true 者执行大括号里面的执行语句3.要是表达式的语句为假 者不执行大括号里面的语句 ...

  7. JavaScript异步流程控制的前世今生

    js的流程控制老大难问题就是异步回调. 一个流程过程,往往会出现回调地狱,这个回调异步控制就被提上研究得议程. 目前有实现的回调流程有以下几种 回调函数实现 事件监听 发布订阅 Promise/A+ ...

  8. JS:2.1,流程控制(if,switch)高级

    ylbtech-流程控制:流程控制(if,switch)高级 if语句 if if-else if-else_if-else switch JS:2.1.0,if语句返回顶部 If 语句 如果希望指定 ...

  9. Node.js 模块之Nimble流程控制

    NodeJS异步的特性有时候会导致程序非常的难看,回调一层套着一层,这个时候就要用流程控制模块来控制究竟是同步还是异步了. Nimble是一个轻量.可移植的函数式流程控制模块.经过最小化和压缩后只有8 ...

最新文章

  1. 自定义报错返回_Keras编写自定义层--以GroupNormalization为例
  2. 从民工到CCNA-献给想考认证的朋友
  3. Web服务器性能/压力测试工具http_load、webbench、ab、Siege使用教程
  4. 成功案例_网络营销成功案例分析
  5. Angular CLI版本问题(Your global Angular CLI version (12.2.7) is greater than your local version (9.0.3))
  6. Altium Designer -- PCB设置板框
  7. DUMP文件分析6:简单的堆破坏示例
  8. python执行批处理文件_如何从Python中执行批处理文件,从而改变调用进程的环境?...
  9. (99)利用任务task实现单字节乘法功能,面试必问(二十三)(第20天)
  10. taobao-pamirs-schedule-2.0源码分析——任务队列分配源码分析
  11. php.ini添加的变量读取,php用ini_get获取php.ini里变量值的方法
  12. PHP抖音无水印解析视频代码+思路
  13. Python数据分析案例——20年【科比NBA】生涯|数据分析
  14. CSRF跨站请求伪造漏洞修复方案
  15. 时尚达人玩转短裤短裙凉鞋搭配
  16. Unity Visual Effect Graph 制作Fireworks烟花特效
  17. 省赛前的做题计划记录
  18. PostgreSQL重启恢复---XLOG 2.0
  19. aptx与ldac音质区别_蓝牙协议LDAC和aptx的区别?
  20. 使用思维导图的甘特图进行项目排期

热门文章

  1. 同学我看你答题分钱总被淘汰你得充充电了!
  2. 盘点 | 2017 年 关于 Python 的 13 件大事
  3. 冠军奖30万!刘强东搞了个“猪脸识别”比赛,中美两地同时启动(附比赛详细日程及赛题说明)
  4. Redis 缓存击穿(失效)、缓存穿透、缓存雪崩怎么解决?
  5. 一份来自贾扬清的AI修炼指南:不存在算法工程师,调参侠没有市场
  6. 基于深度学习的文本分类应用!
  7. 万引大佬自曝这样被MIT拒掉:“系里不喜欢你”,找校长对峙后悟了
  8. 双非山东科技胜过吉大,湖南大学超哈工大,US News2022世界大学排行榜引热议...
  9. 10月1日之后,你新建的GitHub库默认分支不叫「master」了
  10. CBNet和DetectoRS:COCO数据集霸榜模型