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

不论是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. System.Windows.Media.Imageing.BItmapImage 这么用才不会占用文件

    // Read byte[] from png file BinaryReader binReader = new BinaryReader(File.Open(filepath, FileMode. ...

  2. WPF中嵌入普通Win32程序的方法

    公司现在在研发基于.Net中WPF技术的产品,由于要兼容旧有产品,比如一些旧有的Win32程序.第三方的Win32程序等等,还要实现自动登录这些外部Win32程序,因此必须能够将这些程序整合到我们的系 ...

  3. mysql不支持事务

    注释掉/etc/my.cnf 下面的 #loose-skip-innodb

  4. 【uTenux实验】互斥体

    互斥体,维基百科中交互斥锁.其定义是这样的:互斥锁(英语:英语:Mutual exclusion,缩写 Mutex)是一种用于多线程编程中,防止两条线程同时对同一公共资源(比如全局变量)进行读写的机制 ...

  5. (C#) 基本概念一览表

    A abstract class An abstract class is a class that must be inherited and have the methods overridden ...

  6. [HTML5]HTML语义(Semantics)

    HTML 是有含义的 语义指的是计算机语言定义的符号有其规范的含义,HTML中的标签.属性和属性值都有其约定的含义. 语义和默认样式有所不同,默认样式是浏览器设定的一些常用标签的表现形式,而语义化的主 ...

  7. Linq系列

    LINQ 图解 Linq中的Select——投影 Linq学习资源 Expert C# 5.0中的Linq部分

  8. 【php】assert函数的用法

    [php]assert函数的用法 http://www.douban.com/note/217557007/ 2012-06-01 10:32:37   assert这个函数在php语言中是用来判断一 ...

  9. 链地址法实现HashMap

    前注:本文介绍的HashMap并非Java类库的实现.而是根据哈希表知识的一个实现. 上文介绍了开放地址法实现HashTable,它的缺点是对hashCode映射为地址后如果出现重复地址,则会占用其他 ...

  10. XE6移动开发环境搭建之IOS篇(2):安装VM9虚拟机(有图有真相)

    网上能找到的关于Delphi XE系列的移动开发环境的相关文章甚少,本文尽量以详细的图文内容.傻瓜式的表达来告诉你想要的答案. 原创作品,请尊重作者劳动成果,转载请注明出处!!! 1.安装VM9英文原 ...