异步流程控制库GoWithTheFlow
异步流程控制库GoWithTheFlow
一个尾触发方式来控制异步流程的库, 有seq(顺序执行) par(同步执行) 两种方法
博客
http://notes.jetienne.com/2011/07/17/gowiththeflow.js-async-flow-control-with-a-zen-touch.html
Github
https://github.com/lumixraku/gowiththeflow.js/blob/master/gowiththeflow.js
使用
顺序执行
Flow().seq(function(next) {
setTimeout(function(){
console.log("first job");
next('error', 'retValue');
},500);
}).seq(function(next, error, result) {
console.log(error, result);
console.log("second job. run *after* first job");
next();
});
同步执行
最后挂载的seq将会在所有par任务执行结束后执行
errors results是数组 保存所有的par的结果
执行结果顺序是挂载任务的顺序
Flow().par(function(next){
setTimeout(function(){
console.log("job foo");
next(null, "foo");
},1000);
}).par(function(next){
setTimeout(function(){
console.log("job bar");
next(null, "bar");
},500);
}).par(function(next){
setTimeout(function(){
console.log("job zoo");
next(null, "zoo");
},500);
}).seq(function(next, errors, results){
console.log("job run *after* the completion of foo and bar");
console.assert(errors.length == 3 && errors[0] === null && errors[1] == null)
console.assert(results.length == 3 && results[0] === 'foo' && results[1] == 'bar')
next();
})
实现
var Flow = function() {
var self, stack = [],
//等待所有同步操作完成后开始执行异步的部分
timerId = setTimeout(function() {
timerId = null;
self._next();
}, 0);
return self = {
destroy: function() {
timerId && clearTimeout(timerId);
},
//seq 和par 都只是挂载了函数(把函数保存在了stacks中) 并没有执行
//同步执行的任务都在一个元素中
//比如 stack = [ [f1()], [f2(), f3()], [f4()] ]
//表示 f1() f2()f3() f4() 三个顺序执行的任务 其中任务2 f2f3两个函数是并行执行
par: function(callback, isSeq) {
if (isSeq || !(stack[stack.length - 1] instanceof Array)) {
stack.push([]);
}
stack[stack.length - 1].push(callback);
return self; //链式调用
},
seq: function(callback) {
return self.par(callback, true);
},
//调用一次_next 解决一次顺序任务
_next: function(err, result) {
var errors = [],
results = [],
callbacks = stack.shift() || [], //callbacks [function(next){....}]
nbReturn = callbacks.length,
isSeq = nbReturn == 1; //表明是顺序任务 比如上面 [f1()] 这种情况
for (var i = 0; i < callbacks.length; i++) {
(function(fct, index) {
//fct就是异步函数 fct接受三个参数 fct(next, err, result)
//而这个function(err, result) 就是next
//next接受两个参数 next('error', 'retValue');
fct(function(error, result) {
errors[index] = error;
results[index] = result;
if (--nbReturn == 0) { //表明此次顺序任务执行完毕 比如上面[f2,f3] 到f3的时候
self._next(isSeq ? errors[0] : errors, isSeq ? results[0] : results)
}
}, err, result);
})(callbacks[i], i);
}
}
}
};
// export in common js
if (typeof module !== "undefined" && ('exports' in module)) {
module.exports = Flow;
}
// Asynchronous Module Definition - http://requirejs.org/docs/whyamd.html
if (typeof define === 'function' && define.amd) {
define('Flow', [], function() {
return Flow;
});
}
异步流程控制库GoWithTheFlow的更多相关文章
- js 异步流程控制之 avQ(avril.queue)
废话前言 写了多年的js,遇到过最蛋疼的事情莫过于callback hell, 相信大家也感同身受. 业界许多大大也为此提出了很多不错的解决方案,我所了解的主要有: 朴灵 event proxy, 简 ...
- node核心:异步流程控制
Node.js的异步是整个学习Node.js过程中重中之重. 1)异步流程控制学习重点 2)Api写法:Error-first Callback 和 EventEmitter 3)中流砥柱:Promi ...
- nodejs进阶(7)—async异步流程控制
Async介绍 Async是一个流程控制工具包,提供了直接而强大的异步功能.基于Javascript为Node.js设计,同时也可以直接在浏览器中使用. Async提供了大约20个函数,包括常用的 m ...
- 使用yield进行异步流程控制
现状 目前我们对异步回调的解决方案有这么几种:回调,deferred/promise和事件触发.回调的方式自不必说,需要硬编码调用,而且有可能会出现复杂的嵌套关系,造成"回调黑洞" ...
- 【javascript】Promise/A+ 规范简单实现 异步流程控制思想
——基于es6:Promise/A+ 规范简单实现 异步流程控制思想 前言: nodejs强大的异步处理能力使得它在服务器端大放异彩,基于它的应用不断的增加,但是异步随之带来的嵌套.难以理解的代码让 ...
- Nodejs中使用异步流程控制Async
首先,我们都知道,Node基于事件驱动的异步I/O架构,所谓异步就是非阻塞,说白了就是一个事件执行了,我不必等待它执行完成后我才能执行下一个事件.所以在Node环境中的模块基本都是异步的,上一篇说到我 ...
- node基础13:异步流程控制
1.流程控制 因为在node中大部分的api都是异步的,比如说读取文件,如果采用回调函数的形式,很容易造成地狱回调,代码非常不容易进行维护. 因此,为了解决这个问题,有大神写了async这个中间件.极 ...
- (一)Nodejs - 框架类库 - Nodejs异步流程控制Async
简介 Async是一个流程控制工具包,提供了直接而强大的异步功能 应用场景 业务流程逻辑复杂,适应异步编程,减少回调的嵌套 安装 npm insatll async 函数介绍 Collections ...
- async 异步流程控制规则
github 学习async网址 : https://github.com/caolan/async/ 1.Async 函数介绍 async 主要实现了三个部分的流程控制功能 1.集合:Collect ...
随机推荐
- NSDate 的一些操作(比较、创建、在现有date加减一定时间等)
创建当前时间 NSDate *date = [NSDate date]; 从现在开始的24小时 NSTimeInterval a_day = 24*60*60; NSDate *tomorrow = ...
- java web 之 BeanUtils.populate的作用
首先,它是在org.apache.commons.beanutils.BeanUtils包中的一个方法. 方法的作用:用来将一些 key-value 的值(例如 hashmap)映射到 bean 中的 ...
- MySql按指定天数进行分组数据统计分析 1
这几天,在做数据统计,在对数据库数据进行统计过程中,有个需求就是要按照指定天数进行分组, 之前一直没有找到好的方法,就先取出数据,在程序中进行分组. 后发现,可以在SQL语句中实现按天数分组. 例: ...
- Bootstrap之Button.js
查看Button.js的源代码 +function ($) { 'use strict'; // BUTTON PUBLIC CLASS DEFINITION // ================= ...
- LED大屏发布系统
开发LED大屏发布系统已经有5.6年里了,可以根据专家.用户的要求进行布置,所有的数据都是通过TCP通讯获得的,所有的显示项目都是通过配置文件进行设置的,所以系统运行效率高.灵活.界面丰富多彩等.
- javascript 数据结构和算法读书笔记 > 第一章 javascript的编程环境和模型
1.变量的声明和初始化 必须使用关键字 var,后跟变量名,后面还可以跟一个赋值表达式. var name; var age = 5; var str = 'hello'; var flg = fal ...
- 《C语言深度剖析》学习笔记----C语言中的符号
本节主要讲C语言中的各种符号,包括注释符.单引号双信号以及逻辑运算符等. 一.注释符 注释符号和注释在程序的预编译期就已经被解决了,在预编译期间,编译器会将注释符号和注释符号之间的部分简单的替换成为空 ...
- Android不规则瀑布流照片墙的实现+LruCache算法
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZnJhbmNpc3NoaQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...
- bootstrap注意事项(八)一些辅助信息
1.三角符号 通过使用三角符号可以指示某个元素具有下拉菜单的功能.注意,向上弹出式菜单中的三角符号是反方向的. <!DOCTYPE HTML><html><head> ...
- 8种排序算法的C#实现
排序是将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列.排序根据涉及的存储器的不同分为内部排序和外部排序:内部排序是指待排序记录存放在内存进行的排序过程:外部排序是指待排序记录的数 ...