自已实现的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/ ...
随机推荐
- 为什么学习Ruby On Rails:
简单总结了一下自己为什么喜欢ruby on rails: 语法简单,写代码很愉快,比较接近伪代码: 喜欢其强大的正则表达式和字符串操作. ruby中面向对象更自由,更动态: ruby给人信任,相信你了 ...
- iBeacon知识1
iBeacon的数据主要由四种资讯构成,分别是UUID(通用唯一标识符).Major.Minor.Measured Power. UUID是规定为ISO/IEC11578:1996标准的128位标识符 ...
- 关掉apache2服务器日志文件
磁盘空间突然满了,才发现是这个东西占空间.11个G的空间 修改:/etc/apache2/size-available/default <VirtualHost *:80>ServerNa ...
- POS管理系统之设备出库
JSP: <html> <head> <title>登录</title> <style type="text/css&quo ...
- openldap主机访问控制(基于ip)
http://blog.oddbit.com/2013/07/22/generating-a-membero/ http://gsr-linux.blogspot.jp/2011/01/howto-o ...
- 百度地图API示例之根据城市名设置地图中心点
代码: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" con ...
- [已解决]EnvironmentError: mysql_config not found
$ pip install MySQL-python==1.2.5 报错: EnvironmentError: mysql_config not found 原因是缺少包 libmysqlclient ...
- MSSQLSERVER之发布-分发-订阅
一.环境 发布服务器 O S: Windows servier 2003 64位 Soft: Microsoft SqlServer 2008 R2 I P: 192.168.3.70 HOST-NA ...
- logging日志模块
为什么要做日志: 审计跟踪:但错误发生时,你需要清除知道该如何处理,通过对日志跟踪,你可以获取该错误发生的具体环境,你需要确切知道什么是什么引起该错误,什么对该错误不会造成影响. 跟踪应用的警告和错误 ...
- modelsim(1) - 安装和使用 心得
最近一段时间使用modelsim, 一,安装 使用的时候,出现license验证不对. 由于经常换虚拟机,要注意首先MAC地址是否换了,如果换了,license要重新做! 其次/etc/hosts的I ...