var async = require('async');
// series 串形任务
console.time('cost')
async.series({
two:function(callback){
setTimeout(function(){
console.log('串形任务two');
//第一个参数 错误原因,当为真时,接收函数err参数接收到原因,并定为报错,停止执行后边的任务
callback(null,'串形任务two 执行完毕');
},)
},
one:function(callback){
setTimeout(function(){
console.log('串形任务one');
callback(null,'串形任务one 执行完毕');
},)
},
},function(err,seriesRes){//如果callback第一个参数为真,err接收到第一个参数,判为任务错误,终止后续任务
console.log(err,seriesRes);
console.timeEnd('cost')
}) //parallel 并行任务
// 传递给最终的回调函数的是按任务生命顺序排列,而不是完成顺序
console.time('cost_p')
async.parallel({
two:function(callback){
setTimeout(function(){
console.log('并行任务two');
//第一个参数 错误原因,当为真时,接收函数err参数接收到原因,并定为报错,停止执行后边的任务
callback(null,'并行任务two 执行完毕');
},)
},
one:function(callback){
setTimeout(function(){
console.log('并行任务one');
callback(null,'并行任务one 执行完毕');
},)
},
},function(err,seriesRes){//如果callback第一个参数为真,err接收到第一个参数,判为任务错误,终止后续任务
console.log(err,seriesRes);
console.timeEnd('cost_p')
}) // waterfall 瀑布形任务
console.time('cost_w')
async.waterfall([
function(callback){
setTimeout(function(){
console.log('瀑布形任务 1');
//第一个参数 错误原因,当为真时,接收函数err参数接收到原因,并定为报错,停止执行后边的任务
callback(null,'咖啡');
},)
},
function(res,callback){
setTimeout(function(){
console.log('瀑布形任务 2');
callback(null,res+'+加糖');
},)
},
function(res,callback){
setTimeout(function(){
console.log('瀑布形任务 3');
callback(null,res+'+加牛奶');
},)
}
],function(err,seriesRes){//如果callback第一个参数为真,err接收到第一个参数,判为任务错误,终止后续任务
console.log(err,seriesRes);
console.timeEnd('cost_w')
}) //auto 多情况组合任务
// 例:做饭任务
console.time('做饭任务cost:')
async.auto({
water:function(callback){
callback(null,'水')
},
flour:function(callback){
callback(null,'面粉')
},
mix:['water','flour',function(res,callback){
callback(null,res.water+"+"+res.flour+'+和面');
}],
stream:['mix',function(res,cb){
cb(null,res.mix+'+蒸馒头')
}]
},function(err,seriesRes){
console.log(err,seriesRes);
console.timeEnd('做饭任务cost:')
})
async.forEach
var fs = require('fs');
var async = require('async');
var arr = [{
filename:'1.txt',cont:''
},{
filename:'2.txt',cont:''
},{
filename:'3.txt',cont:''
}]
async.forEach(arr,function(item,cb){ },function(err,res){
console.log(err,res)
})

async.each/ async.eachSeries  用法一样

sync.each/ async.eachSeries     each是并行,eachSeries是串行。。所以each的某个item抛出错误后其他的不影响,而eachSeries后面的就挂了。。

var pageNumArr = [,,,];
async.each(pageNumArr,function(offsetIndex,callback){
console.log(offsetIndex)
callback(null,'num:'+offsetIndex)
},function(errRes){//如果callback第一个参数为真,err接收到第一个参数,判为任务错误,终止后续任务
// console.log(err,seriesRes)
console.log(errRes)
})

async 珠峰培训node正式课笔记 【async】任务流程控制,异步流程控制的更多相关文章

  1. 珠峰培训node正式课--【笔记】|全局对象 | process | util | fs | stream 流

    全局对象: console  : __filename     ; __dirname     ; setTimeOut     ; setImmediate(把参数函数放在下一个环节执行) proc ...

  2. node 进程管理 child_process [spawn,exec] | 珠峰培训node正式课 网络爬虫

    run.js ; function set(){ i++ setTimeout(function(){ console.log(i) ){ set(); } },) }set(); child_pro ...

  3. 珠峰培训node 珠峰爬虫| cron 定时任务

    1.cron 定时任务 CronJob var CronJob = require('cron').CronJob; // 秒 分钟 时 天

  4. Node.js学习笔记(2)——关于异步编程风格

    Node.js的异步编程风格是它的一大特点,在代码中就是体现在回调中. 首先是代码的顺序执行: function heavyCompute(n, callback) { var count = 0, ...

  5. node核心:异步流程控制

    Node.js的异步是整个学习Node.js过程中重中之重. 1)异步流程控制学习重点 2)Api写法:Error-first Callback 和 EventEmitter 3)中流砥柱:Promi ...

  6. 多线程编程学习笔记——async和await(一)

    接上文 多线程编程学习笔记——任务并行库(一) 接上文 多线程编程学习笔记——任务并行库(二) 接上文 多线程编程学习笔记——任务并行库(三) 接上文 多线程编程学习笔记——任务并行库(四) 通过前面 ...

  7. 多线程编程学习笔记——async和await(二)

    接上文 多线程编程学习笔记——async和await(一) 三.   对连续的异步任务使用await操作符 本示例学习如何阅读有多个await方法方法时,程序的实际流程是怎么样的,理解await的异步 ...

  8. 多线程编程学习笔记——async和await(三)

    接上文 多线程编程学习笔记——async和await(一) 接上文 多线程编程学习笔记——async和await(二) 五.   处理异步操作中的异常 本示例学习如何在异步函数中处理异常,学习如何对多 ...

  9. es6学习笔记-async函数

    1 前情摘要 前段时间时间进行项目开发,需求安排不是很合理,导致一直高强度的加班工作,这一个月不是常说的996,简直是936,还好熬过来了.在此期间不是刚学会了es6的promise,在项目有用到pr ...

随机推荐

  1. Replication:事务复制 Subscriber的主键列是只读的

    在使用Transactional Replication时,Subscriber 被认为是“Read-Only”的 , All data at the Subscriber is “read-only ...

  2. c#调用python脚本实现排序(适用于python脚本中不包含第三方模块的情况)

    引用:https://www.cnblogs.com/zoe-yan/p/10374757.html 利用vs2017c#调用python脚本需要安装IronPython.我是通过vs2017的工具- ...

  3. Echarts 学习系列(3)-Echarts动态数据交互

    写在前面 上一小节,我们总结了折线(面积)图.柱状(条形)图.饼(圆环)图类型的图表. 但是,都是静态的.接下来的,这一小节,总结的是Echarts 动态数据的交换. 前置条件 开发环境:win10 ...

  4. 树莓派安装使用docker

    2019/11/11, 树莓派4B, Raspbian Buster,Docker 19.03.4 摘要:树莓派Raspbian Buster中安装Docker,Dockerfile更改软件源 安装d ...

  5. mvc_第一遍_业务逻辑层和模型

    常用的动态网页对象: 之前我们提到了,使用request对象可以获得和用户请求相关的一系列信息.这一节,我们来看看另外两个常用对象的常规用途. response对象:用于向客户回应.最常用的用法类似于 ...

  6. DevExpress之GridControl控件小知识

    DevExpress之GridControl控件小知识 一.当代码中的DataTable中有建数据关系时,DevExpress 的 GridControl 会自动增加一个子视图 .列名也就是子表的字段 ...

  7. mybatis中用注解如何处理存储过程返回的多个结果集?

    sql代码: create procedure sptest.getnamesanditems() reads sql data dynamic result sets 2 BEGIN ATOMIC ...

  8. php调用webservice接口,java代码接收不到参数

    前段时间做了一个项目的二次开发,有个功能是需要php调用java实现的webservice接口,并传递一些参数给接口,然后按照对方提供的接口说明文档进行传参调用,java那边有接收到请求,但是参数总是 ...

  9. MySQL里默认的几个库是干啥的?

    本文涉及:MySQL安装后自带的4个数据库:information_schema. performance_schema.sys.mysql的作用及其中各个表所存储的数据含义 information_ ...

  10. 【转载】 C#中手动创建一个DataTable对象并写入数据

    在C#操作集合数据的过程中,有时候需要手动创建一个DataTable对象,并手动设置DataTable对象的Columns列名等信息,最后再往手动创建的DataTable对象中写入相应的数据信息,此时 ...