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的语法与C++和Java相似,但它是一种弱类型的语言,意味着变量在声明时无需...
这篇小结将聚焦于JavaScript的基础和进阶知识,帮助你在面试中表现出色。以下是对"javascript面试应急知识点小结"的详细解析。 一、基础概念 1. 变量与数据类型:JavaScript有七种数据类型,包括基本数据类型...
在本文中,我们将深入探讨Koa框架的一些实用小技巧,包括Cookie的安全保护、异常处理以及监控当前正在处理的请求数。 首先,让我们关注Cookie的安全保护。在基于Cookie验证用户状态的系统中,确保Cookie的安全性至...
通过设置异步(async)选项,可以指定请求是异步执行还是同步执行,一般推荐使用异步请求以避免阻塞用户界面。 开发者还可以在请求发送之前使用beforeSend回调函数,该函数提供了对XMLHttpRequest对象的访问,允许...
例如,你可以使用`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等,可以在这些方法中进行数据的初始化和更新。此外...
`async/await`语法使得异步代码看起来更像同步代码,易于理解和维护。 13. **模板引擎**:如Mustache和Handlebars,用于将数据和HTML模板结合生成视图,提高代码的可读性和复用性。 14. **性能优化**:避免阻塞DOM...
此外,C# 6及以后版本引入了很多新特性,如async/await异步编程模型,提高了程序的响应性和可读性。 在描述中提到的数据库部分,数据库是存储和管理数据的系统,对于任何应用来说都是关键组件。Java和C#都有各自的...
`Pool`允许我们指定最大并发进程数,并提供`apply_async`或`map`方法来异步执行任务。此外,为了确保所有任务都被处理,即使某些任务执行时间较长,我们可以使用`join`来等待所有进程完成。 总的来说,Python的`...
11. **异步编程**:C#支持异步编程模型,如async和await关键字,使开发者能编写非阻塞的I/O密集型或计算密集型任务,提高应用程序性能。 12. **文件与流**:C#提供了处理文件和流的类,如FileStream、StreamReader...
Vue.js中的`async/await`语法可以很好地支持异步操作,并且与`Promise`结合使用来处理异步数据加载。 在加载策略方面,页面的初始加载和后续的数据加载是用户体验的关键。文件内容中通过点击按钮触发`loadMoreData`...
前言 第一篇 网站基础知识 第1章 网站架构及其演变过程2 1.1 软件的三大类型2 1.2 基础的结构并不简单3 1.3 架构演变的起点5 1.4 海量数据的解决方案5 1.4.1 缓存和页面静态化5 ...22.3 小结309
throw new Error('async error') }, 1000) } catch(e) { console.log(e, 'err') console.log('continue...') } } main(); 这段代码中,setTimeout 的回调函数抛出一个错误,并不会在 catch
在回调函数、Promise或者async/await中,我们可以使用`.catch`或`try...catch`来捕获错误。例如,当使用Promise时,可以在链式调用的末尾添加`.catch`来处理错误。对于async函数,`try...catch`语句可以嵌套在函数体...
- **1.4 小结** - 介绍了.NET的概念和发展背景,并强调了C#作为.NET的核心编程语言的重要性。 ##### 第二章:运行环境 —— 全面了解.NET - **2.1 .NET结构** - .NET框架包括两个主要部分:公共语言运行时(CLR...
- **1.4 小结** - 本章总结了.NET平台的概念以及C#语言的关键特点,为后续的学习打下了基础。 ##### 第二章:运行环境 - **2.1 .NET结构** - .NET框架主要包括公共语言运行时(CLR)和.NET Framework类库两大...
在这个例子中,`AsyncDemo`方法使用`async`关键字声明为异步,内部的`Task.Run`负责执行耗时操作。`await`关键字让调用者在等待任务完成时不会阻塞,可以继续执行后续代码。 总的来说,C#的异步编程提供了多种方式...
`'generator-star-spacing'`规则允许使用`async/await`。 ESLint不仅可以在命令行中运行,也可以集成到代码编辑器中,比如VSCode。在初始化Vue项目时,可以选择是否开启ESLint管理代码,开启后,ESLint会在代码保存...