node异步流程控制async
1.串行无关联:async.series(tasks,callback);
多个函数依次执行,之间没有数据交换,其中一个函数出错,后续函数不再执行
async.series({
one: function(callback){
callback(null, 1);
},
two: function(callback){
callback(null, 2);
}
},function(err, results) {
console.log(results);
});
例:交叉执行
//-------------n13_async.js------------------------------
function oneFun()
{
/*
setTimeout(function(){ },1000);
*/
ii=0;
setInterval(function(){
console.log("aaa="+new Date());
ii++;
if(ii==3){
clearInterval(this);
}
},1000);
console.log("oneFun");
}
function twoFun()
{
jj=0;
setInterval(function(){
console.log("bbb="+new Date());
jj++;
if(jj==3){
clearInterval(this);
}
},1000);
console.log("oneFun执行完毕");
} oneFun(0);console.log("oneFun执行");
twoFun();
console.log("twoFun执行");
console.log("主进程执行完毕");
//-------------n13_async.js------------------------------
var async = require('async');
function exec(){
async.series({
one: function(done){
ii=0;
setInterval(function(){
console.log('aaa='+new Date());
ii++;
if(ii==3){
clearInterval(this);
done(null,{one:"one"});
}
},1000);
},
two: function(done){
jj=0;
setInterval(function(){
console.log('bbb='+new Date());
jj++;
if(jj>3){
clearInterval(this);
done(null,{two:"two"});
}
},1000);
}
},
function(err,rs) {
console.log(err);
console.log(rs);
});
}
exec(); 2.并行无关联:async.parallel(tasks,callback);
多个函数并行执行,最后汇总结果,如果某一个流程出错就退出
async.parallel({
one: function(callback){
callback(null, 1);
},
two: function(callback){
callback(null, 2);
}
},function(err, results) {
console.log(results);
});
3.串行有关联:waterfall
每一步执行时需要由上一步执行的结果当做参数.所以每一步必须串行等待
async.waterfall([
function (done) { done(null, 'one');
},
function (onearg, done) { done(null, onearg + '| two');
},
function (twoarg, done) { done(null, twoarg + '| three');
},
function (threearg, done) { done(null, threearg + '| four');
}
], function (error, result) {
console.log(result);
console.timeEnd('waterfall');
})
例子:
function exec(){
async.waterfall(
[
function(done){
ii=0;
setInterval(function(){
console.log("aaa="+new Date());
ii++;
if(ii==3){
clearInterval(this);
done(null,'one完毕');
}
},1000);
},
function(preValue,done){
jj=0;
setInterval(function(){
console.log(preValue+"="+new Date());
jj++;
if(jj==3){
clearInterval(this);
done(null,preValue+',two完毕');
}
},1000); }
],function(err,rs){
console.log(err);
console.log(rs);
}
)
} 4.parallelLimit(tasks, limit, [callback]) parallelLimit函数和parallel类似,但是它多了一个参数limit。
limit参数限制任务只能同时并发一定数量,而不是无限制并发, async.parallelLimit([
function(callback){
callback(null, 'one');
},
function(callback){
callback(null, 'two');
}
],
2, //只允许同时有两个函数并行
function(err, results){
console.log(results);
});
1.串行无关联:async.series(tasks,callback);
多个函数依次执行,之间没有数据交换,其中一个函数出错,后续函数不再执行
async.series({
one: function(callback){
callback(null, 1);
},
two: function(callback){
callback(null, 2);
}
},function(err, results) {
console.log(results);
});
例:交叉执行
//-------------n13_async.js------------------------------
function oneFun()
{
/*
setTimeout(function(){ },1000);
*/
ii=0;
setInterval(function(){
console.log("aaa="+new Date());
ii++;
if(ii==3){
clearInterval(this);
}
},1000);
console.log("oneFun");
}
function twoFun()
{
jj=0;
setInterval(function(){
console.log("bbb="+new Date());
jj++;
if(jj==3){
clearInterval(this);
}
},1000);
console.log("oneFun执行完毕");
} oneFun(0);console.log("oneFun执行");
twoFun();
console.log("twoFun执行");
console.log("主进程执行完毕");
//-------------n13_async.js------------------------------
var async = require('async');
function exec(){
async.series({
one: function(done){
ii=0;
setInterval(function(){
console.log('aaa='+new Date());
ii++;
if(ii==3){
clearInterval(this);
done(null,{one:"one"});
}
},1000);
},
two: function(done){
jj=0;
setInterval(function(){
console.log('bbb='+new Date());
jj++;
if(jj>3){
clearInterval(this);
done(null,{two:"two"});
}
},1000);
}
},
function(err,rs) {
console.log(err);
console.log(rs);
});
}
exec(); 2.并行无关联:async.parallel(tasks,callback);
多个函数并行执行,最后汇总结果,如果某一个流程出错就退出
async.parallel({
one: function(callback){
callback(null, 1);
},
two: function(callback){
callback(null, 2);
}
},function(err, results) {
console.log(results);
});
3.串行有关联:waterfall
每一步执行时需要由上一步执行的结果当做参数.所以每一步必须串行等待
async.waterfall([
function (done) { done(null, 'one');
},
function (onearg, done) { done(null, onearg + '| two');
},
function (twoarg, done) { done(null, twoarg + '| three');
},
function (threearg, done) { done(null, threearg + '| four');
}
], function (error, result) {
console.log(result);
console.timeEnd('waterfall');
})
例子:
function exec(){
async.waterfall(
[
function(done){
ii=0;
setInterval(function(){
console.log("aaa="+new Date());
ii++;
if(ii==3){
clearInterval(this);
done(null,'one完毕');
}
},1000);
},
function(preValue,done){
jj=0;
setInterval(function(){
console.log(preValue+"="+new Date());
jj++;
if(jj==3){
clearInterval(this);
done(null,preValue+',two完毕');
}
},1000); }
],function(err,rs){
console.log(err);
console.log(rs);
}
)
} 4.parallelLimit(tasks, limit, [callback]) parallelLimit函数和parallel类似,但是它多了一个参数limit。
limit参数限制任务只能同时并发一定数量,而不是无限制并发, async.parallelLimit([
function(callback){
callback(null, 'one');
},
function(callback){
callback(null, 'two');
}
],
2, //只允许同时有两个函数并行
function(err, results){
console.log(results);
});
我们写的js代码就像是有一个国王(主线程),而nodejs给国王提供了很多"仆人"。早上,一个仆人叫醒了国王,问他有什么需要。 国王给他一份清单,上面列举了所有需要完成的任务,然后睡回笼觉去了。当国王回去睡觉之后,仆人才离开国王,拿着清单,给其它的仆人一个个布置任务。 仆人们各自忙各自的去了(异步执行),直到完成了自己的任务后,才回来把结果禀告给国王。国王一次只召见一个人(主线程开始执行),其它的人就在外面排着队等着。国王处理完这个结果后,可能给他布置一个新的任务,或者就直接让他走了,然后再召见下一个人。等所有的结果都处理完了,国王就继续睡觉去了。直接有新的仆人完成任务后过来找他。 这就是国王的幸福生活。
node异步流程控制async的更多相关文章
- Nodejs中使用异步流程控制Async
首先,我们都知道,Node基于事件驱动的异步I/O架构,所谓异步就是非阻塞,说白了就是一个事件执行了,我不必等待它执行完成后我才能执行下一个事件.所以在Node环境中的模块基本都是异步的,上一篇说到我 ...
- (一)Nodejs - 框架类库 - Nodejs异步流程控制Async
简介 Async是一个流程控制工具包,提供了直接而强大的异步功能 应用场景 业务流程逻辑复杂,适应异步编程,减少回调的嵌套 安装 npm insatll async 函数介绍 Collections ...
- Nodejs异步流程控制Async
http://www.cnblogs.com/huair_12/p/4117351.html 很好的总结 关联下 以便以后学习使用
- node核心:异步流程控制
Node.js的异步是整个学习Node.js过程中重中之重. 1)异步流程控制学习重点 2)Api写法:Error-first Callback 和 EventEmitter 3)中流砥柱:Promi ...
- nodejs进阶(7)—async异步流程控制
Async介绍 Async是一个流程控制工具包,提供了直接而强大的异步功能.基于Javascript为Node.js设计,同时也可以直接在浏览器中使用. Async提供了大约20个函数,包括常用的 m ...
- 使用yield进行异步流程控制
现状 目前我们对异步回调的解决方案有这么几种:回调,deferred/promise和事件触发.回调的方式自不必说,需要硬编码调用,而且有可能会出现复杂的嵌套关系,造成"回调黑洞" ...
- js 异步流程控制之 avQ(avril.queue)
废话前言 写了多年的js,遇到过最蛋疼的事情莫过于callback hell, 相信大家也感同身受. 业界许多大大也为此提出了很多不错的解决方案,我所了解的主要有: 朴灵 event proxy, 简 ...
- 【javascript】Promise/A+ 规范简单实现 异步流程控制思想
——基于es6:Promise/A+ 规范简单实现 异步流程控制思想 前言: nodejs强大的异步处理能力使得它在服务器端大放异彩,基于它的应用不断的增加,但是异步随之带来的嵌套.难以理解的代码让 ...
- 异步流程控制库GoWithTheFlow
异步流程控制库GoWithTheFlow 一个尾触发方式来控制异步流程的库, 有seq(顺序执行) par(同步执行) 两种方法 博客 http://notes.jetienne.com/2011/0 ...
随机推荐
- Activity 5秒 Broadcast 10秒 Service 20秒
第一:什么会引发ANR? 在Android里,应用程序的响应性是由Activity Manager和WindowManager系统服务监视的 .当它监测到以下情况中的一个时,Android就会针对特定 ...
- onTouch事件分发
事件机制 我们知道view中有onTouch,onClick, 1.并且onTouch优先于onClick执行, 2.onTouch有返回值,为true时onClick并不再执行了 因为一切VIew都 ...
- 前端性能优化-减少http请求,dns预解析,减少repaint和reflow
前端性能优化方法: 一 . 减少http请求 (1)通过合并图片,减少请求,俗称css sprites(css精灵)css sprites (2)lazyload懒加载,在需要的时候再加载 1.定义: ...
- 英语知识(与字面意思 相反的) Corner office
Corner office 角落办公室是一种身份 角落办公室,即处于公司最佳位置的高级办公室,通常指总裁或总经理办公室.喻某人在公司或单位里的最高职务或在社会上与众不同的身份地位. 这里的角落是指方形 ...
- Linux C 获取 文件的大小
通过Linux C库函数来获取文件的大小 #include <unistd.h> #include <sys/types.h> #include <sys/stat.h& ...
- Sublime Text 3如何编译运行c++程序
扯 去了一趟清北学堂感觉自己玩的特别嗨,算法没学到什么,前端和爬虫的知识到是会了不少. 然后知道了有一个叫做sublime text 3的编辑器,好用不好用不知道,就冲着它好看,就决定以后就用它了. ...
- varints
Protocol Buffer技术详解(数据编码) - Stephen_Liu - 博客园 https://www.cnblogs.com/stephen-liu74/archive/2013/01/ ...
- __destruct()析构函数的执行时刻 __construct()构造函数传入参数 构造函数与后台登录安全
<?php class test_construct_avg { function __construct($input = '') { $this->input = $input; } ...
- kvm_read_guest*函数分析
2017-06-30 在KVM中基于其搞特权及,可以透明的读写客户机的内存信息,为此KVM提供了一套API,这里姑且称之为kvm_read_guest_virt*/kvm_write_guest_vi ...
- 阿里云部署 Flask + uWSGI + Nginx
一.引言 今天入手了一台阿里云服务器,是centeros 7.5版本.本文解决的是 Flask 的部署问题.假设你的Flask的应用已经完成,现在只是部署的问题,本文以部署我的二次开发微信订阅号的项目 ...