`
superhj1987
  • 浏览: 205639 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Async源码分析

 
阅读更多

原文链接:http://www.srhang.me/blog/2014/08/22/node-async-analysis/

 

最近在使用到node js的async库的时候,对其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))();
    };

开始先对参数进行了检查,判断tasks是否是一个function数组。然后使用了一个内部函数wrapIterator封装了实现。wrapIterator的参数带出了async.iterator函数:

async.iterator = function (tasks) {
        var makeCallback = function (index) {
            var fn = function () {
                if (tasks.length) {
                    tasks[index].apply(null, arguments);
                }
                return fn.next(); //这个地方有必要么???
            };
            fn.next = function () {
                return (index < tasks.length - 1) ? makeCallback(index + 1): null;
            };
            return fn;
        };
        return makeCallback(0);
    };

这个函数,其主要实现是其内部函数makeCallback。其功能就是迭代tasks,封装其中的每一个function,让其执行后返回下一个function,以此实现迭代。

接下来,再回到wrapIterator,此function是对iterator的封装。执行后返回的是一个匿名function。其明确的参数只有一个err。当err不为空的时候,直接执行callback function。否则从index为1开始取出参数列表(第一个默认传递err),并把iterator的下一个function包装之后push到args中(如果没有下一个function了则push回调函数)。接下来,则执行当前的iterator,执行的参数是下一个iterator function(作为这一步的回调函数)以及部分参数(如果当前的iterator被调用时传递了多余一个的参数)。这样在当前iterator中回调下一个iterator,依次迭代执行,直至执行完所有function和callback。

0
0
分享到:
评论

相关推荐

    android async http 源码

    Android Async HTTP库是一款轻量级的网络请求库,专为Android平台设计,它简化了...此外,源码分析还能帮助我们理解如何优化网络请求,处理各种网络环境下的异常情况,以及如何利用现代Android网络库如OkHttp提升性能。

    springmvc源码分析

    在这个源码分析中,我们将深入探讨Spring MVC的核心组件和工作流程。 1. **DispatcherServlet**:Spring MVC的入口点,它是所有请求的前端控制器。当一个HTTP请求到达服务器时,DispatcherServlet负责拦截请求,并...

    火焰图工具async-profiler-master.zip|async-profiler-master.zip

    1. **安装**:下载async-profiler源码或预编译的二进制文件,根据JVM版本和操作系统进行配置。 2. **启动**:通过JVM参数`-agentpath`指定async-profiler的路径,启动时附加到JVM。 3. **控制**:可以通过HTTP接口...

    vue 源码分析2.zip

    在这个"vue 源码分析2.zip"压缩包中,我们可以看到"vue3集训营第二天代码",这意味着它可能包含了关于Vue 3源码解析的一些示例或教程。 Vue 3 的核心改进之一是Composition API,这是一个革命性的变化,它允许...

    SQLite-f047920c_sqlite3async.c_sqlite源码_

    SQLite是一款开源、轻型的关系型数据库管理系统,广泛应用...通过阅读和分析这个源码,我们可以学习到如何在SQLite中实现并发控制、回调机制以及错误处理等高级技术,这些都是成为一名熟练的数据库开发者所必备的技能。

    火焰图工具async-profiler-1.7.tar.gz

    在这个`async-profiler-1.7.tar.gz`压缩包中,包含的就是`async-profiler`的源码和相关资源。 `async-profiler`的主要功能在于提供了一种直观的方式来查看JVM(Java虚拟机)中哪些方法或代码片段占用了最多的CPU...

    深入理解Node.js:核心思想与源码分析

    本文将从Node.js的架构设计、核心模块实现、以及源码分析等层面进行深入探讨。 首先,我们需要了解Node.js的整体架构。Node.js主要包含四个关键部分:Node Standard Library、Node Bindings、V8引擎和Libuv库。Node...

    MongoDB Java Driver 源码分析(1):Package 概述

    本篇文章将聚焦于MongoDB Java Driver的源码分析,首先从Package概述的角度进行深入探讨。 MongoDB Java Driver的源码主要分为以下几个核心包: 1. **com.mongodb**: 这是最顶层的包,包含了驱动的核心组件。`...

    springboot中@Async默认线程池导致OOM问题

    四、SimpleAsyncTaskExecutor 源码分析 通过查看 SimpleAsyncTaskExecutor 的源码,我们可以看到其提供了限流机制。限流机制是通过 concurrencyThrottle 对象来实现的,concurrencyThrottle 对象会在任务执行前进行...

    商业编程-源码-数据库技术源代码 async_exe.zip

    "商业编程-源码-数据库技术源代码" 三个标签进一步确认了这个压缩包的内容,强调了其在商业应用中的实际用途,源码的特点意味着可以深入学习和定制,而数据库技术则是整个系统的基础,对于数据存储、管理和分析至关...

    android-async-http-master

    三、源码结构分析 `android-async-http-master`项目的源码主要包含以下几个部分: 1. **HttpClientModule**:实现了基于Apache HttpClient的网络请求模块,负责发起HTTP请求。 2. **RequestQueue**:请求队列管理,...

    soure:源码分析

    源码分析是软件开发中的重要环节,特别是在JavaScript这种动态、灵活的编程语言中,源码分析可以帮助我们理解代码的工作机制,提升代码质量和性能。在这个场景下,"soure"很可能是指"source code",即原始代码,而...

    开源中国源码学习数据篇(一)之android-async-http框架和AsyncTask

    通过分析和运行这段代码,我们可以更深入地理解这两个组件的使用方法和它们之间的差异。 在实际应用中,`android-async-http`提供了更强大的网络请求功能,如自定义请求头、支持多种HTTP方法等,而`AsyncTask`则更...

    Python-asyncio源码注解

    **Python-asyncio源码注解** `asyncio` 是 Python 的一个标准库,用于编写异步并发代码,尤其在处理I/O密集型任务时表现出色。它基于协程(coroutines)和事件循环(event loop)的概念,使得开发者能够以同步编程...

    线程学习源码

    C#从.NET Framework 4.0开始引入了基于Task的异步编程模型(TAP),提供了async和await关键字。这种方式可以使得UI线程在等待异步操作时不会被阻塞,提高了用户体验。Task类代表一个异步操作,它的Result属性用于获取...

    javascrip王者归来源码.zip

    《JavaScript王者归来》是针对JavaScript编程的一套深入学习资源,包含源码分析,旨在帮助开发者提升在JavaScript领域的技能。此压缩包中包含了三部分主要内容:《JavaScript王者归来》的教材内容、JavaScript高级...

    Activiti6.0.0最新源码

    Activiti6版本仅保留了Activiti5版本中的异步作业执行器(async executor)。定时作业被划分了四个不同的表:executable jobs, timer jobs, suspended jobs 和deadletter jobs。引擎可以更快的执行作业。定时器作业...

Global site tag (gtag.js) - Google Analytics