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

不论是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. Google Tensorflow 源码编译(一):Protobuf<v3.0.0-alpha-3>

    这几天终于把tensorflow安装上了,中间遇到过不少的问题,这里记录下来.供大家想源码安装的参考. 安装环境:POWER8处理器,Docker容器Ubuntu14.04镜像. Build Prot ...

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

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

  3. SQL Server 2008 数据库通过镜像同步备份(数据库热备)

    数据库镜像运行模式: 异步数据库镜像模式(异步,高性能模式) 同步数据库镜像模式(同步,高安全模式) 参考资料: http://technet.microsoft.com/zh-cn/library/ ...

  4. 剑指offer习题集2

    1.把数组排成最小的数 class Solution { public: static bool compare(const string& s1, const string& s2) ...

  5. Java操作SFTP

    import java.util.Properties; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.jcr ...

  6. JNI日志调试LOG和中文乱码

    添加日志: 1. 增加log支持. Android.mk文件增加LOCAL_LDLIBS += -llog 2. C代码中增加(放在最前面) #include <android/log.h> ...

  7. IOS简单的字串替换方法stringByTrimmingCharactersInSet 和空格的替换 ()

    NSString *str = @"一个 (ABC) #@!#^#G@#Dd21e12d!E@!212s012yhsn 汉0932字#@!中..文//>?输~~~@#$#@%#^#^% ...

  8. 如何设置a标签的宽高,如何使a标签的文字垂直居中

    通常情况下a标签是没有宽高的,设置 width 和 height 没有作用. 若要使用 width 和 height,需要把a标签转为块级元素,即:display:block|inline-block ...

  9. spring mvc 初始化错误

    java.lang.NoSuchMethodError: org.springframework.util.ClassUtils.isPresent(Ljava/lang/String;Ljava/l ...

  10. dubbox新特性介绍

    dubbx是当当网对原阿里dubbo2.x的升级,并且兼容原有的dubbox.其中升级了zookeeper和spring版本,并且支持restfull风格的远程调用. dubbox git地址:  h ...