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

不论是C还是js

自已有功能但看着也比人家的丑好多。

  1. //最终效果 同async
  2. //目前实现了个人最常用的 serial 和 waterfall
  3.  
  4. //实现waterfall
  5. // async.waterfall([
  6. // function(callback){
  7. // callback(null, 'one', 'two');
  8. // },
  9. // function(arg1, arg2, callback){
  10. // callback(null, 'three');
  11. // },
  12. // function(arg1, callback){
  13. // // arg1 now equals 'three'
  14. // callback(null, 'done');
  15. // }
  16. // ], function (err, result) {
  17. // // result now equals 'done'
  18. // });
  19.  
  20. var async = (function () {
  21. //这个比较简单
  22. function whilst(fntest, fniterator, fnend) {
  23. if (fntest()) {
  24. fniterator(function (err) {
  25. if (err) {
  26. fnend(err)
  27. }
  28. whilst(fntest, fniterator, fnend)
  29. })
  30. } else {
  31. fnend()
  32. }
  33. }
  34. //后一项作为前一项的最后一列参数 只用修改next指向
  35. function serial(tasks, endcallback) {
  36. function makeCallBack(index) {
  37. var hasnext = (index < tasks.length);
  38. if (hasnext) {
  39. var fn = function () {
  40. var args = Array.prototype.slice(arguments)
  41. var next = makeCallBack(index + 1)
  42. args.push(next)
  43. tasks[index].apply(null, args)
  44. }
  45. fn.hasNext = hasnext
  46. return fn
  47. } else return function () {
  48. endcallback()
  49. }
  50. }
  51. makeCallBack(0)()
  52.  
  53. }
  54. function waterfall(tasks, endcallback) {
  55. function makeCallBack(index) {
  56. var hasnext = (index < tasks.length);
  57. if (hasnext) {
  58. var fn = function () {
  59. //现在需要错误处理,如果第一项参数为err 则endcallback
  60. //arguments 也要从第一项开始过滤
  61. var args = Array.prototype.slice(arguments, 1)
  62. if (arguments[0]) {
  63. endcallback(arguments[0], null)
  64. endcallback = null
  65. } else {
  66. var next
  67. if (index + 1 == tasks.length) {
  68. next = endcallback
  69. } else {
  70. next = makeCallBack(index + 1)
  71. // args.push(next);
  72. }
  73. //这样只是把后一项函数,接在前一项之后。
  74. //而前一项函数的其他参数,后一项并不能得到。
  75. //把下一项调用的参数加到arg的前面
  76. for (var key in arguments) {
  77. if (key != "0") {
  78. args.push(arguments[key]);
  79. }
  80. }
  81. args.push(next);
  82. tasks[index].apply(null, args)
  83. }
  84. }
  85. return fn
  86. }
  87. //这样只是调用end方法,不能传参,要传参,需要向之前一样,把后一项接到tasks最后一项的callback上
  88. // else return function () {
  89. // //返回 result
  90. // endcallback(null)
  91. // }
  92. }
  93. //这样是直接调用返回的函数,下一个函数再调用下一个。
  94. //怎么把前一项的多余参赛传到下一项?
  95. makeCallBack(0)()
  96. }
  97. return {
  98. waterfall: waterfall,
  99. serial: serial,
  100. whilst: whilst
  101. }
  102. })()
  103.  
  104. async.serial([
  105. function (callback) { console.log("1"); callback() },
  106. function (callback) { console.log("2"); callback() },
  107. function (callback) { console.log("3"); callback() }
  108. ], function () {
  109. console.log("end")
  110. })
  111.  
  112. async.waterfall([
  113. function (callback) { console.log("1"); callback(null, "a"); },
  114. function (arg1, callback) { console.log("arg1" + arg1); console.log("2"); callback(null, "err3", "d"); },
  115. function (arg1, arg2, callback) { console.log("3"); callback(null, "res"); }
  116. ], function (err, result) {
  117. console.log("end");
  118. console.log(result);
  119. })
  120.  
  121. var count = 0;
  122.  
  123. async.whilst(
  124. function () { return count < 10; },
  125. function (callback) {
  126. count++;
  127. console.log(count)
  128. setTimeout(callback, 100);
  129. },
  130. function (err) {
  131. // 5 seconds have passed
  132. }
  133. );
  134.  
  135. //迭代器
  136. // (function () {
  137. // function getiter(tasks) {
  138. // var i;
  139. // for (i = 0; i < tasks.length; i++) {
  140. // (function (index) {
  141. // var hasnext = ((index + 1) < tasks.length);
  142. // tasks[index].hasNext = hasnext;
  143. // console.log(index + " " + tasks[index].hasNext)
  144. // if (tasks[index].hasNext) {
  145. // tasks[index].next = tasks[index + 1]
  146. // }
  147. // })(i)
  148. // }
  149. // return tasks[0]
  150. // }
  151. // var tasks = [
  152. // function () { console.log("1") },
  153. // function () { console.log("2") },
  154. // function () { console.log("3") },
  155. // function () { console.log("4") },
  156. // ]
  157. // var task = getiter(tasks)
  158. // while (task.hasNext) {
  159. // task();
  160. // task = task.next;
  161. // }
  162.  
  163. // })()

自已实现的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. 【freemaker】之自定义指令<#macro>

    测试代码 @Test public void test07(){ try { root.put("name", "张三"); freemakerUtil.fpr ...

  2. [系统集成] OpenLDAP使用AD密码

    关于OpenLDAP和AD帐号的整合,网上有大量的文档,绝大多数都不符合我们的需求,下面的方案是我经过调研.测试.修改.最终采用的. . 需求概述 公司网络中有两种帐号:OpenLDAP帐号和AD帐号 ...

  3. 【AT91SAM3S】ADC中断方式采集数据

    板子依旧是英倍特的EK-SAM3S.ADC部分的原理图如下: PB1是一个复用引脚,在这里被用作AD功能,对应芯片上的AD5.即,使用片内ADC的5通道测VR1上2号引脚的电压. 实验采用了SysTi ...

  4. 相机标定:关于用Levenberg-Marquardt算法在相机标定中应用

    LM算法在相机标定的应用共有三处. (1)单目标定或双目标定中,在内参固定的情况下,计算最佳外参.OpenCV中对应的函数为findExtrinsicCameraParams2. (2)单目标定中,在 ...

  5. 手把手教你接口自动化测试 – SoapUI & Groovy

    手把手教你接口自动化测试 – SoapUI & Groovy http://www.cnblogs.com/wade-xu/p/4236295.html 关键词:SoapUI接口测试,接口自动 ...

  6. (转)SVN 服务端、客户端安装及配置、导入导出项目

    SVN服务器搭建和使用(一) Subversion是优秀的版本控制工具,其具体的的优点和详细介绍,这里就不再多说. 首先来下载和搭建SVN服务器. 现在Subversion已经迁移到apache网站上 ...

  7. history 查看历史操作记录在shell脚本执行中无法显示问题

    今天使用shell脚本想查看历史操作命令的记录于是写了一个再简单不过的脚本,可是以chmod +x 权限执行./test.sh发现执行后没有任何反应.于是查找原因:将脚本文件中的#!/bin/bash ...

  8. Spark Streaming 事务处理彻底掌握

    本期内容: 1. Exactly once容错 2. 数据输出不重复 一. 事务场景 : 以银行转帐一次为例,A用户转账给B用户,如何保证事务的一致性,即A用户能够转出且只能转出一次,B用户能够收到且 ...

  9. Angular $http解析通过接口获得的json数据

    刚接触angular不久,对很多东西都不了解,今天需要用angular通过接口得到json数据,折腾了好久,总算是能获取到数据了,下面是部分源码,仅供参考: HTML部分: <body ng-a ...

  10. information_schema系列二(列,列权限,事件,存储引擎)

    这个系列的文章主要是为了能够让自己了解MySQL5.7的一些系统表,统一做一下备注和使用,也希望分享出来让大家能够有一点点的受益. 1:COLUMNS 老规矩.查一下这个表,看一下记录,由于这个是看表 ...