async简单使用
2018-06-24 00:02:48来源:未知 阅读 ()
node的异步io虽然好用,但是控制异步流程确实一个比较麻烦的事情,比如在爬虫中控制并发数量,避免并发过大导致网站宕机或被加入黑名单。因此需要一个工具来控制并发,这个工具可以自己写或者使用async(官方文档点击这里)。代码基于node 8.x,如版本过低可能会出现错误。
说明
async本身有七十多个方法,这里只说明几个比较常用的简单函数用法,想进一步学习可参考文档。总的来说分为两大类。
一、第一个参数为??函数集合,也??就是遍历执行集合中的函数。
1.顺序执行 series(tasks , function(err,res){ })
tasks为函数数组,数组中的每一项都为待执行函数。
a.下面是一个最简单示例,待执行函数为非异步
1 const asyncx = require( 'async' ); 2 3 let tasks = []; 4 for( let i = 0 ; i < 10 ; i++ ) 5 { 6 tasks.push( 7 function( callback ){ 8 //dosomething 9 console.log( i ); 10 //本函数用来通知async本次任务完成情况,并把结果带出去。 11 callback( null , i ); //第一个参数为异常参数,如果传入一个error( 比如new Error('error') ),并发结束,调用series里的回调。 12 } 13 ) 14 } 15 asyncx.series( tasks , function(err , res ){ 16 if( err ) 17 console.log( err ); 18 console.log( res ); 19 } )
运行结果
b.待执行函数为异步
如果待处理的函数也是异步函数可将callback参数传入到异步函数中,在真正结束的时候调用callback。
1 const asyncx = require( 'async' ); //模块命名为asyncx避免和es7中的async/await冲突 2 3 let tasks = []; 4 for( let i = 0 ; i < 10 ; i++ ) 5 { 6 tasks.push( 7 function( callback ){ 8 setTimeout( function(){ 9 console.log(i); 10 callback( null , 1 ); //在这里整个处理才是真正完成,然后调用callback通知async本任务结束 11 } , 2000 ); 12 } 13 ) 14 } 15 asyncx.series( tasks , function(err , res ){ 16 if( err ) 17 console.log( err ); 18 console.log( res ); 19 } )
如果想要在任务中使用es7的async/await 可将待处理代码放在一个闭包中(直接在function前加async会报错),下面示例。
1 const asyncx = require( 'async' ); //模块命名为asyncx避免和es7中的async/await冲突 2 3 let tasks = []; 4 for( let i = 0 ; i < 10 ; i++ ) 5 { 6 tasks.push( 7 function( callback ){ 8 (async function(){ 9 let sum = await doSomething( i ); 10 callback( null , sum ); 11 })(); 12 } 13 ) 14 } 15 16 async function doSomething( i ){ 17 return new Promise( function( resolve , reject ){ 18 setTimeout(function(){ 19 console.log( i ); 20 resolve( i ); 21 } , 1000 ); 22 } ); 23 } 24 25 asyncx.series( tasks , function(err , res ){ 26 if( err ) 27 console.log( err ); 28 console.log( res ); 29 } )
2.并发执行 parallel( tasks , function(err,res){} )
参数如上,不限制并发
3.并发限制执行parallelLimit( tasks , num , function(err,res){} )
参数同上,num为最大并发数量
二、第一个参数为非????函数集合。
比如
async.map(['file1','file2','file3'], function(item,callback){ //dosomething callback( null , 'done' ); }, function(err, results) { // results is now an array of stats for each file });
第二个参数为一个异步函数,要能接受两个参数item(前面集合中的一项),callback 通知async任务完成
还有其他的函数用法都是类似只是具体作用不一样。可参考官方文档说明。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:面向对象笔记2 原型链 解释
- 关于jQuery UI 使用心得及技巧 2020-03-29
- js中去掉字串左右空格 2020-03-20
- Js中如何使用sort() 2020-03-18
- JS简单去除数组中重复项的方法 2020-03-16
- JS判断浏览器是否安装flash插件的简单方法 2020-03-12
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash