不得不说,人和人的技术确实有差距,同样的功能,其他人就是有办写写的更优雅性能更好

不论是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 只实现了一部分功能的更多相关文章

  1. img只显示图片一部分 或 css设置背景图片只显示图片指定区域

    17:14 2016/3/22img只显示图片一部分 或 css设置背景图片只显示图片指定区域 background-position: 100% 56%; 设置背景图片显示图片的哪个坐标区域,图片左 ...

  2. Excel只想显示一部分日期,怎样把其余部分隐藏起来?

      问题:只想显示一部分日期,怎样把其余部分隐藏起来? 方法:分列 Step1:选中需要修改的单元格——数据——分列. Step2:固定宽度——点击下一步. Step3:在建立分列处单击鼠标(若想取消 ...

  3. 两种方法实现用CSS切割图片只取图片中一部分

    切割图片这里不是真正的切割,只是用CSS取图片中的一部分而已,主要有两种方式,一是做为某一元素的背景图片,二是用img元素的属性.下面有个不错的示例,大家可以参考下 切割图片这里不是真正的切割,只是用 ...

  4. iOS UIImageView 显示不规则图片只显示图片一部分保证图片不被压缩

    //只需如下设置imageView [picImg setContentScaleFactor:[[UIScreenmainScreen] scale]]; picImg.contentMode =  ...

  5. mysql 千万级数据查询效率实践,分析 mysql查询优化实践--本文只做了一部分,仅供参考

    数据量, 1300万的表加上112万的表 注意: 本文只做了部分优化,并不全面,仅供参考, 欢迎指点.   请移步tim查看,因为写的时候在tim写的,粘贴过来截图有问题,就直接上链接了. https ...

  6. CAsyncSocket只传输了一部分数据(UDP),后面是乱码

    void CCAsyncSocketDlg::OnBnClickedBtnSend() { UpdateData(TRUE); TCHAR ipstr[INET_ADDRSTRLEN]; DWORD ...

  7. 关于aspxgridview里面过长内容只显示的一部分的处理方案

    protected void g_Message_CustomColumnDisplayText(object sender, ASPxGridViewColumnDisplayTextEventAr ...

  8. DataGrid列中加入CheckBox 全选 点击Header全选 和 只操作选中部分 功能的实现

    先写个效果 中午接着写 反正没人看 只是给自己记录

  9. TensorFlow从1到2(十五)(完结)在浏览器做机器学习

    TensorFlow的Javascript版 TensorFlow一直努力扩展自己的基础平台环境,除了熟悉的Python,当前的TensorFlow还实现了支持Javascript/C++/Java/ ...

随机推荐

  1. 转载: Emmet:HTML/CSS代码快速编写神器

    Emmet:HTML/CSS代码快速编写神器 因为文章严禁转载,那本着做一个遵纪守法的好公民,我就不转载了,把链接放下面,方便查阅. http://www.iteye.com/news/27580

  2. Spring学习 Ioc篇(三)

    1.在注解注入方式中,首先要在xml中引入如下的红线的命名空间: <?xml version="1.0" encoding="UTF-8" ?> & ...

  3. Windows 7 安装 .netfx 4 卡住

    net stop wuauserv rename \windows\SoftwareDistribution SoftwareDistribution_old net start wuauserv

  4. linux下nginx服务器域名指定目录

    一般,域名指定ip之后,需要在ip所在的机器去指定相应站点的目录,否则域名会不起作用: 下面说说linux下的nginx服务器指定目录的细节: 域名绑定目录的配置文件都放到这里: /usr/local ...

  5. Hibernate5.2关联关系之单向一对多(一)

    Hibernate5.2之单向一对多 一. 简介    Hibernate中最复杂的应该就是各种关联(单向一对多.单向多对一.双向一对多.一对一.多对多)关系的映射,于是笔者就想着去写一些关于Hibe ...

  6. 异步数据库查询 Z

    Introduction Microsoft .NET 4.5 introduced new "async and await" methods to provide an eas ...

  7. 【解决】如何导入导出SharePoint列表和文档库

    早期的SharePoint管理工具stsadm.exe只能导出/导入网站,但不能导出/导入列表和文档库.但在PowerShell增加了此命令,具体操作如下. I. 导出列表或文档库 Export-SP ...

  8. C#_GDI+详细教程(图形图像编程基础)

    第7章  C#图形图像编程基础 本章主要介绍使用C#进行图形图像编程基础,其中包括GDI+绘图基础.C#图像处理基础以及简单的图像处理技术. 7.1  GDI+绘图基础 编写图形程序时需要使用GDI( ...

  9. Linux下的shell编程(一)BY 四喜三顺

    Ctrl + Alt + Tvim文本编辑器:i(插入模式),v(可视模式),Esc(普通模式),:w(保存),:r(打开),:q(退出)gvim 文本编辑器vim的升级版gedit 更常用的文本编辑 ...

  10. 剑指Offer:面试题21——包含min函数的栈(java实现)

    问题描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数.在该栈中,调用min,push及pop的时间复杂度都是O(1). 思路:加入一个辅助栈用来存储最小值集合 (这里要注 ...