`

(转)async中小结

 
阅读更多
http://blog.csdn.net/sxyizhiren/article/details/18240435

这里记录使用到的几个接口,给自己和需要的人参考。



1.async.waterfall

用法:async.waterfall(tasks, [callback]);



task是函数组成的数组,callback是中途出错或者全部执行完后的回调函数。

它的特点是串行执行函数,并且前一个函数的结果会传给下一个函数,比较类似Step模块的功能。

我门看这是它readme中自带的例子:
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'   
});


其中第一个函数只有一个callback参数,callback是一定要有的,必须是最后一个参数。callback的作用是执行完一个函数后调用callback,然后就会进入下一个函数。如果你需要给第一个函数传递除callback外的参数怎么办?

如function(arg1,arg2,callback){}

这里没有直接的方法,但是有间接的方法,就是把这个函数放到第二个的位置,根据waterfall的特点可以传参数给下一个函数,于是就可以在第一个函数里面把参数传给你的第二个函数了。



那它是怎么传参数给下一个函数的呢?我们看到第一个函数调用了callback(null, 'one', 'two');

这里如果不是null而是err,那么这里的(null, 'one', 'two')就会紧接着传给waterfall的第二个参数,即async.waterfall(tasks, [callback])中的callback。

这里是null就表示没有错误,所以就会紧着着调用第二个函数,同时第二个函数的参数是'one', 'two',callback.也就是它除去null,并在最后添加callback之后调用下一个函数.



那么如果最后一个函数执行完了他会怎样。刚才我们讲了,如果一个函数返回err就直接进入到callback退出tasks中后续函数的执行,如果没有err就执行到tasks中最后一个函数了。那么最后一个函数不论它是否err,它内部调用callback(err,result1,result2...)中的所有参数都会如数传给async.waterfall(tasks, [callback])中的callback。中间不会再有加减参数的行为。



2.async.mapSeries

用法async.mapSeries(arr, iterator, callback)

arr是一个数组,不能是一个json对象。

作用的将arr中的每一项依次拿给iterator去执行,执行结果传给最后的callback

例子:

async.mapSeries([1,2,3,4], function(node,cb){cb(null,node+1);}, function(err,results){

console.log(results);

//这里打印[2,3,4,5],如果cb返回的结果有多个如cb(null,node+1,node+1,node+1,node+1),那么结果将是这种形式的:

//[[2,2,2,2],[3,3,3,3],[4,4,4,4],[5,5,5,5]]

});

同样如果iterator中调用cb()都是传的null,所有arr中的元素都能得到执行,如果某个iterator传递err给cb()。那么将直接跳到callback中去,传给callback的是(err,results).这里results自然是不完整的,所以没有意义。





3.async.mapLimit

用法:mapLimit(arr, limit, iterator, callback)

这个作用和mapSeries相似,唯一不同的是mapSeries是串行的,一个一个执行,而mapLimit可以同时执行limit个。

你可能会问,node单线程怎么能同时执行多个呢?当然这里的多个是指多个需要callback等待的异步操作。mapSeries是等待上一个callback回来再执行这一个;mapLimit是同时发起多个异步操作,然后一起等待callback的返回,返回一个就再发起下一个。

如果limit为1即mapLimit(arr, 1, iterator, callback),就和mapSeries(arr, iterator, callback)的作用一样了。



4.eachSeries

用法eachSeries(arr, iterator, callback)

作用类似mapSeries,也是串行执行,唯一不同的是,最后的callback只能收到err/null参数,不会返回每一次iterator的执行结果results.



5.each

用法:each(arr, iterator, callback)

作用与eachSeries类似,最后也只能收到err/null作为反馈,但与eachSeries串行执行不同,each是全部执行并等待全部完成后返回,中间如果有错误就不等全部完成就立即返回。



可以看到,函数名中有each的是没有结果集的,函数明名map是有结果集的;

也可以看到,函数都是只要iterator返回err就立即调用callback返回。

并且其内部有控制过,callback只会被调用一次,如果你发现被回调了多次,那么这一定是一个bug,可以向作者反馈。



6.series

用法series(tasks, [callback])

它的作用和waterfall相似,都是串行执行函数,都是一旦err就放弃后面的执行并回调callback。

很大的差别是series中各个函数之间不传递参数,而是形成结果集。waterfall的callback全部成功时接收的是tasks中最后一个的回调结果。series中全部成功时接受的是每一个task的回调结果形成的数组。这个结果集可以参看上面的mapSeries中的结果集。

因为不传递参数所以tasks中每个函数的参数只留下callback;因为接收结果集,所以callback的参数是(err,results).

例子:

async.series([
    function(callback){
        // do some stuff ...
        callback(null, 'one');
    },
    function(callback){
        // do some more stuff ...
        callback(null, 'two');
    }
],
// optional callback
function(err, results){
    // results is now equal to ['one', 'two']
});
分享到:
评论

相关推荐

    JavaScript初学小结

    这篇小结将深入探讨JavaScript的基础知识,包括语法、数据类型、控制结构、函数、对象以及它在实际开发中的应用。 一、基础语法 JavaScript的语法与C++和Java相似,但它是一种弱类型的语言,意味着变量在声明时无需...

    javascript面试应急知识点小结

    这篇小结将聚焦于JavaScript的基础和进阶知识,帮助你在面试中表现出色。以下是对"javascript面试应急知识点小结"的详细解析。 一、基础概念 1. 变量与数据类型:JavaScript有七种数据类型,包括基本数据类型...

    Koa 使用小技巧(小结)

    在本文中,我们将深入探讨Koa框架的一些实用小技巧,包括Cookie的安全保护、异常处理以及监控当前正在处理的请求数。 首先,让我们关注Cookie的安全保护。在基于Cookie验证用户状态的系统中,确保Cookie的安全性至...

    Jquery操作Ajax方法小结

    通过设置异步(async)选项,可以指定请求是异步执行还是同步执行,一般推荐使用异步请求以避免阻塞用户界面。 开发者还可以在请求发送之前使用beforeSend回调函数,该函数提供了对XMLHttpRequest对象的访问,允许...

    Python中使用多进程来实现并行处理的方法小结

    例如,你可以使用`Pool.apply_async()`或`Pool.map()`函数并行处理列表中的元素。下面是一个简单的例子: ```python from multiprocessing import Pool def square(n): return n ** 2 if __name__ == '__main__'...

    微信小程序框架(个人总结)

    在微信小程序中,不同页面间的通信不同于传统Web应用,不能直接通过全局变量或DOM事件来传递数据。小程序提供了Page对象的生命周期方法,如onLoad、onShow、onHide等,可以在这些方法中进行数据的初始化和更新。此外...

    页面常用的JS脚本小结

    `async/await`语法使得异步代码看起来更像同步代码,易于理解和维护。 13. **模板引擎**:如Mustache和Handlebars,用于将数据和HTML模板结合生成视图,提高代码的可读性和复用性。 14. **性能优化**:避免阻塞DOM...

    学习上的一些小结,主要是java和C#等

    此外,C# 6及以后版本引入了很多新特性,如async/await异步编程模型,提高了程序的响应性和可读性。 在描述中提到的数据库部分,数据库是存储和管理数据的系统,对于任何应用来说都是关键组件。Java和C#都有各自的...

    python多进程控制学习小结

    `Pool`允许我们指定最大并发进程数,并提供`apply_async`或`map`方法来异步执行任务。此外,为了确保所有任务都被处理,即使某些任务执行时间较长,我们可以使用`join`来等待所有进程完成。 总的来说,Python的`...

    C# 基础知识[小结及例子].rar

    11. **异步编程**:C#支持异步编程模型,如async和await关键字,使开发者能编写非阻塞的I/O密集型或计算密集型任务,提高应用程序性能。 12. **文件与流**:C#提供了处理文件和流的类,如FileStream、StreamReader...

    vue项目小结 - 滚动监听钩子、时间求解、加载、路由、pinia、异步请求、界面展示、数据架构技巧等核心功能总结

    Vue.js中的`async/await`语法可以很好地支持异步操作,并且与`Promise`结合使用来处理异步数据加载。 在加载策略方面,页面的初始加载和后续的数据加载是用户体验的关键。文件内容中通过点击按钮触发`loadMoreData`...

    看透springMvc源代码分析与实践

    前言 第一篇 网站基础知识 第1章 网站架构及其演变过程2 1.1 软件的三大类型2 1.2 基础的结构并不简单3 1.3 架构演变的起点5 1.4 海量数据的解决方案5 1.4.1 缓存和页面静态化5 ...22.3 小结309

    JS异步错误捕获的一些事小结

    throw new Error('async error') }, 1000) } catch(e) { console.log(e, 'err') console.log('continue...') } } main(); 这段代码中,setTimeout 的回调函数抛出一个错误,并不会在 catch

    JavaScript中错误正确处理方式小结你用对了吗

    在回调函数、Promise或者async/await中,我们可以使用`.catch`或`try...catch`来捕获错误。例如,当使用Promise时,可以在链式调用的末尾添加`.catch`来处理错误。对于async函数,`try...catch`语句可以嵌套在函数体...

    c#完全手册

    - **1.4 小结** - 介绍了.NET的概念和发展背景,并强调了C#作为.NET的核心编程语言的重要性。 ##### 第二章:运行环境 —— 全面了解.NET - **2.1 .NET结构** - .NET框架包括两个主要部分:公共语言运行时(CLR...

    C#经典教程

    - **1.4 小结** - 本章总结了.NET平台的概念以及C#语言的关键特点,为后续的学习打下了基础。 ##### 第二章:运行环境 - **2.1 .NET结构** - .NET框架主要包括公共语言运行时(CLR)和.NET Framework类库两大...

    C#异步调用实例小结

    在这个例子中,`AsyncDemo`方法使用`async`关键字声明为异步,内部的`Task.Run`负责执行耗时操作。`await`关键字让调用者在等待任务完成时不会阻塞,可以继续执行后续代码。 总的来说,C#的异步编程提供了多种方式...

    详解ESLint在Vue中的使用小结

    `'generator-star-spacing'`规则允许使用`async/await`。 ESLint不仅可以在命令行中运行,也可以集成到代码编辑器中,比如VSCode。在初始化Vue项目时,可以选择是否开启ESLint管理代码,开启后,ESLint会在代码保存...

Global site tag (gtag.js) - Google Analytics