自已实现的async 只实现了一部分功能
不得不说,人和人的技术确实有差距,同样的功能,其他人就是有办写写的更优雅性能更好
不论是C还是js
自已有功能但看着也比人家的丑好多。
//最终效果 同async
//目前实现了个人最常用的 serial 和 waterfall //实现waterfall
// async.waterfall([
// function(callback){
// callback(null, 'one', 'two');
// },
// function(arg1, arg2, callback){
// callback(null, 'three');
// },
// function(arg1, callback){
// // arg1 now equals 'three'
// callback(null, 'done');
// }
// ], function (err, result) {
// // result now equals 'done'
// }); var async = (function () {
//这个比较简单
function whilst(fntest, fniterator, fnend) {
if (fntest()) {
fniterator(function (err) {
if (err) {
fnend(err)
}
whilst(fntest, fniterator, fnend)
})
} else {
fnend()
}
}
//后一项作为前一项的最后一列参数 只用修改next指向
function serial(tasks, endcallback) {
function makeCallBack(index) {
var hasnext = (index < tasks.length);
if (hasnext) {
var fn = function () {
var args = Array.prototype.slice(arguments)
var next = makeCallBack(index + 1)
args.push(next)
tasks[index].apply(null, args)
}
fn.hasNext = hasnext
return fn
} else return function () {
endcallback()
}
}
makeCallBack(0)() }
function waterfall(tasks, endcallback) {
function makeCallBack(index) {
var hasnext = (index < tasks.length);
if (hasnext) {
var fn = function () {
//现在需要错误处理,如果第一项参数为err 则endcallback
//arguments 也要从第一项开始过滤
var args = Array.prototype.slice(arguments, 1)
if (arguments[0]) {
endcallback(arguments[0], null)
endcallback = null
} else {
var next
if (index + 1 == tasks.length) {
next = endcallback
} else {
next = makeCallBack(index + 1)
// args.push(next);
}
//这样只是把后一项函数,接在前一项之后。
//而前一项函数的其他参数,后一项并不能得到。
//把下一项调用的参数加到arg的前面
for (var key in arguments) {
if (key != "0") {
args.push(arguments[key]);
}
}
args.push(next);
tasks[index].apply(null, args)
}
}
return fn
}
//这样只是调用end方法,不能传参,要传参,需要向之前一样,把后一项接到tasks最后一项的callback上
// else return function () {
// //返回 result
// endcallback(null)
// }
}
//这样是直接调用返回的函数,下一个函数再调用下一个。
//怎么把前一项的多余参赛传到下一项?
makeCallBack(0)()
}
return {
waterfall: waterfall,
serial: serial,
whilst: whilst
}
})() async.serial([
function (callback) { console.log("1"); callback() },
function (callback) { console.log("2"); callback() },
function (callback) { console.log("3"); callback() }
], function () {
console.log("end")
}) async.waterfall([
function (callback) { console.log("1"); callback(null, "a"); },
function (arg1, callback) { console.log("arg1" + arg1); console.log("2"); callback(null, "err3", "d"); },
function (arg1, arg2, callback) { console.log("3"); callback(null, "res"); }
], function (err, result) {
console.log("end");
console.log(result);
}) var count = 0; async.whilst(
function () { return count < 10; },
function (callback) {
count++;
console.log(count)
setTimeout(callback, 100);
},
function (err) {
// 5 seconds have passed
}
); //迭代器
// (function () {
// function getiter(tasks) {
// var i;
// for (i = 0; i < tasks.length; i++) {
// (function (index) {
// var hasnext = ((index + 1) < tasks.length);
// tasks[index].hasNext = hasnext;
// console.log(index + " " + tasks[index].hasNext)
// if (tasks[index].hasNext) {
// tasks[index].next = tasks[index + 1]
// }
// })(i)
// }
// return tasks[0]
// }
// var tasks = [
// function () { console.log("1") },
// function () { console.log("2") },
// function () { console.log("3") },
// function () { console.log("4") },
// ]
// var task = getiter(tasks)
// while (task.hasNext) {
// task();
// task = task.next;
// } // })()
自已实现的async 只实现了一部分功能的更多相关文章
- img只显示图片一部分 或 css设置背景图片只显示图片指定区域
17:14 2016/3/22img只显示图片一部分 或 css设置背景图片只显示图片指定区域 background-position: 100% 56%; 设置背景图片显示图片的哪个坐标区域,图片左 ...
- Excel只想显示一部分日期,怎样把其余部分隐藏起来?
问题:只想显示一部分日期,怎样把其余部分隐藏起来? 方法:分列 Step1:选中需要修改的单元格——数据——分列. Step2:固定宽度——点击下一步. Step3:在建立分列处单击鼠标(若想取消 ...
- 两种方法实现用CSS切割图片只取图片中一部分
切割图片这里不是真正的切割,只是用CSS取图片中的一部分而已,主要有两种方式,一是做为某一元素的背景图片,二是用img元素的属性.下面有个不错的示例,大家可以参考下 切割图片这里不是真正的切割,只是用 ...
- iOS UIImageView 显示不规则图片只显示图片一部分保证图片不被压缩
//只需如下设置imageView [picImg setContentScaleFactor:[[UIScreenmainScreen] scale]]; picImg.contentMode = ...
- mysql 千万级数据查询效率实践,分析 mysql查询优化实践--本文只做了一部分,仅供参考
数据量, 1300万的表加上112万的表 注意: 本文只做了部分优化,并不全面,仅供参考, 欢迎指点. 请移步tim查看,因为写的时候在tim写的,粘贴过来截图有问题,就直接上链接了. https ...
- CAsyncSocket只传输了一部分数据(UDP),后面是乱码
void CCAsyncSocketDlg::OnBnClickedBtnSend() { UpdateData(TRUE); TCHAR ipstr[INET_ADDRSTRLEN]; DWORD ...
- 关于aspxgridview里面过长内容只显示的一部分的处理方案
protected void g_Message_CustomColumnDisplayText(object sender, ASPxGridViewColumnDisplayTextEventAr ...
- DataGrid列中加入CheckBox 全选 点击Header全选 和 只操作选中部分 功能的实现
先写个效果 中午接着写 反正没人看 只是给自己记录
- TensorFlow从1到2(十五)(完结)在浏览器做机器学习
TensorFlow的Javascript版 TensorFlow一直努力扩展自己的基础平台环境,除了熟悉的Python,当前的TensorFlow还实现了支持Javascript/C++/Java/ ...
随机推荐
- Hadoop学习13--zookeeper相关
zookeeper要保证各个server之间同步,实现同步的协议是zab协议.此协议有两种模式:恢复模式(选主)和广播模式(同步). 服务启动或者leader崩溃时,进入恢复模式.选举成功且大多数se ...
- VS2010快捷键大全
VS2010版快捷键 Ctrl+E,D ----格式化全部代码 Ctrl+E,F ----格式化选中的代码 CTRL + SHIFT + B生成解决方案 CTRL + F7 生成编译 CTRL + O ...
- ant 自定义taskdef的工作目录
上次同事在用ant执行多层目录的测试用例的时候遇到了一些问题,也就是自定义的taskdef的工作目录总是在开始执行ant的那个目录,而有一些地方用到了当前目录,因此很多测试用命的代码出现了“找不到自定 ...
- git branch几个简单操作
1.git branch 该命令会列出当先项目中的所有分支信息,其中以*开头的表示当前所在的分支.参数-r列出远程仓库中的分支,而-a则远程与本地仓库的全部分支. 2.git branch deve ...
- 使用ADD_CUSTOM_COMMAND 添加自定义命令
e.g. ADD_CUSTOM_COMMAND( TARGET world_server COMMAND cp ${CMAKE_SOURCE_DIR}/CMak ...
- Redis 数据结构使用场景
转自http://get.ftqq.com/523.get 一.redis 数据结构使用场景 原来看过 redisbook 这本书,对 redis 的基本功能都已经熟悉了,从上周开始看 redis 的 ...
- rh6安装oracle11g+ASM
安装步骤我这里略过,主要说下安装过程中遇到到问题或重要步骤: 1.UDEV绑定: for i in b c d e ;doecho "KERNEL==\"sd*\", B ...
- Server 2003序列号
windows2003 64位注册码 Windows 2003 R2 64bit Enterprise VOL Edition 企业版 MR78C-GF2CY-KC864-DTG74-VMT73 VP ...
- hive和ORACLE语法对比
- Android 使用 ksoap2-android 访问WebService(C#)
Android 客户端与后台数据交互的方式有很多种.今天这里记录一下,与WebService的数据交互. 新建一个简单的WebService 创建方式如下: 创建好的项目是这样的. 我们在里面写几句简 ...