async.js原理解析

async.js 原理解析

暂时只是针对常用的Waterfall方法

做node开发,你不能逃避的一个组件:async.js. 神奇之处在于让你用看上去同步的方式写出异步的代码,把我们从各种回调嵌套中解脱出来,程序逻辑一目了然.以下简要对async的each和waterfall方法的实现原理做介绍.

async.each

先看使用方法

async.waterfall([

function(callback){ callback(null, ‘one‘, ‘two‘); }, function(arg1, arg2, callback){ // arg1 now equals ‘one‘ and arg2 now equals ‘two‘ callback(null, ‘three‘); }, function(arg1, callback){ // arg1 now equals ‘three‘ callback(null, ‘done‘); }], function (err,
result) { // result now equals ‘done‘

});

来自官方的例子,waterfall函数接受2个参数,第一个是函数数组,第二个市回调函数.waterfall方法可以让函数数组逐次执行,执行完毕或出现错误的时候,执行最后的回调函数.

关键在于函数数组中额外添加callback这个传入的参数,最开始我以为async维护了一个队列,当我们在函数体内部调用callback的时候,回到async的执行,然后有async去执行下一个函数.事实并不是这样的...

先一句话解释一下整个原理,后面再说明:

把下一个要执行的函数包装在一个函数体中,以callback的方式传入当前执行的函数,当我们显式执行callback()的时候其实调用了下一个函数

我们来看看waterfall的实现:

async.waterfall = function (tasks, callback) {

callback = callback || function () {}; if (!_isArray(tasks)) { var err = new Error(‘First argument to waterfall must be an array of functions‘); return callback(err); } if (!tasks.length) { return callback(); } var wrapIterator = function (iterator) { return
function (err) { if (err) { callback.apply(null, arguments); callback = function () {}; } else { var args = Array.prototype.slice.call(arguments, 1); var next = iterator.next(); if (next) { args.push(wrapIterator(next)); } else { args.push(callback); } async.setImmediate(function
() { iterator.apply(null, args); }); } }; }; wrapIterator(async.iterator(tasks))(); };

逐行解释一下:

首先是定义了一个wrap函数

var wrapIterator = function (iterator){}

然后调用wrapIterator(),async.iterator是返回这样的一个对象

fn: 当前执行的函数 fn.next: 返回下一个iterator的匿名函数

以官方例子的第二个function来说明:

* 首先判断一下有没有err,如果有,直接执行到最后的回调函数

* 把err slice掉,剩下的是传递到下一个函数的参数[‘one‘, ‘two‘]

* 从iterator中取到下一个函数放到参数列表的最后一个,如果没有,放入最后的回调函数[‘one‘, ‘two‘, wrap(function(arg1, callback){})]

* 调用当前要执行的函数,传入的参数,即执行 function(arg1=>‘one‘,arg2=>‘two‘,callback=>‘wrap*****‘){

}

剩下的事情我们就都知道了.

有点啰嗦,不知道说清楚了没有,o(╯□╰)o

时间: 2024-10-08 10:26:49

async.js原理解析的相关文章

JS 实现2+2=5的代码 实现原理解析

当我在http://segmentfault.com/q/1010000000531302 看到的时候 先是一惊. 这是代码 g = function () { H = 3 return H + H } f = function () { Η = 2 return Η + H } // 3 + 3 = 6 alert(g()) // 2 + 2 = 5 alert(f()) 演示地址:http://jsfiddle.net/qhRJY/light/ 当第二个方法执行的时候 alert 弹出的居然

1、JS预解析原理(一)

一.作用域概念.预解析规则.表达式 1.作用域概念 什么是作用域:简单说就是作用的范围,指的是函数在哪些范围内可以用,而在其他部分就不可以使用,如果需要使用就需要重新定义. 作用域的作用是什么:用来执行读或者写的操作. 2.预解析规则 script:自上而下进行解析, 函数:由里到外进行解析. 但是浏览器在执行JS代码的时候会分成两部分操作:预解析以及逐行执行代码 预解析:浏览器在开始工作的时候会先解读JS代码的关键字:比如:var function 参数等,并把解析到的内容存入一个类似仓库的地

JSONP跨域的原理解析

JSONP跨域的原理解析 一种脚本注入行为 在 2011年10月27日 那天写的     已经有 99238 次阅读了 感谢 参考或原文 JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为"Same-Origin Policy"(同源策略).这一策略对于JavaScript代码能够访问的页面内容做了很重要的限制,即JavaScript只能访问与包含它的文档在同一域下的内容. JavaScript这个安全策略在进

Request 接收参数乱码原理解析二:浏览器端编码原理

上一篇<Request 接收参数乱码原理解析一:服务器端解码原理>,分析了服务器端解码的过程,那么浏览器是根据什么编码的呢? 1. 浏览器解码 浏览器根据服务器页面响应Header中的“Content-Type: text/html; charset=gb2312”解码.修改web.config中“responseEncoding=utf-8”,发现服务器页面响应Header变成了“Content-Type: text/html; charset=utf8”. <system.web&g

jQuery图片插件自动轮播原理解析

经常看到项目要用到图片轮播效果,一般的操作流程都是先到网上找一个好看的JQuery图片轮播插件,然后看下demo,再配下参数.好了,关机下班回家 其余的就交给插件吧. 是不是感觉有了jQuery,世界变得那么美好呢. 本人最近用的一个插件是 jquery.carousel.js,官方网站是:http://richardscarrott.co.uk/posts/view/jquery-carousel-plugin 下面,我们来讨论一下图片轮播原理. 首先来个简单的demo 效果图如下: 这是个导

Request 接收参数乱码原理解析一:服务器端解码原理

“Server.UrlDecode(Server.UrlEncode("北京")) == “北京””,先用UrlEncode编码然后用UrlDecode解码,这条语句永远为true吗?答案是否定的,结果可能与很多人预想的不大一样.本文主要分析这一问题出现的原理,研究下Server.UrlEncode(),Server.UrlDecode(),Request["xxx"]三个函数与编码方式的关系. 1. 问题出现的情景 网站采用了GB2312编码,在Web.confi

JS的解析机制

JS的解析机制,是JS的又一大重点知识点,在面试题中更经常出现,今天就来唠唠他们的原理.首先呢,我们在我们伟大的浏览器中,有个叫做JS解析器的东西,它专门用来读取JS,执行JS.一般情况是存在作用域就存在解析,那它是怎么运行的呢.首先呢,然后分成两大步骤. 1 第一步叫做JS预解析,这一步骤实际上是一种准备工作把,在执行之前,它会先浏览整个代码,然后寻找三种东西. 1var  2 函数声明    我来分别解释一下.首先它会提取带var声明的变量,然后放到作用域中,但是不会提取变量的值,会先给他赋

Log4js原理解析

基于log4js 0.6.14版本 Log4js总共三篇博客 <Log4js原理解析>http://write.blog.csdn.net/postedit/42844085 <Log4js配置详解>http://blog.csdn.net/hfty290/article/details/42843737 <Log4js多进程陷阱与避免>http://blog.csdn.net/hfty290/article/details/42843303 一.概述 网络上有不少关于

解决Ajax 跨域问题 - JSONP原理解析

解决Ajax 跨域问题 - JSONP原理解析 为什么会有跨域问题? - 因为有同源策略 同源策略是浏览器的一种安全策略,所谓同源指的是 请求URL地址中的 协议, 域名 和 端口 都相同,只要其中之一不相同就是跨域 同源策略主要为了保证浏览器的安全性 在同源策略下,浏览器**不允许**Ajax跨域获取服务器数据 http://www.example.com/detail.html 跨域请求: http://api.example.com/detail.html 域名不同 http://www.