1.nodejs 異步操作小test
setTimeout(function(){
console.log('asyn- print it now!');
},3000);
console.log('asyn - print it 3 second letter');
setTimeOut()可以設(shè)定延遲
2.在異步操作下使用 try catch語句
錯(cuò)誤的做法:
try{
setTimeout(function(){
var data = a/0;
},1000);
}catch(e){
console.log(e);
}
console.info();
正確的做法:
try{
setTimeout(function(){
var data = a/0;
},1000);
}catch(e){
console.log(e);
}
console.info();
3.Async的串行流程
先要install async庫
var async = require('async');
async.series([
function(callback){
callback(null,'hello');
},
function(callback){
callback(null,'async');
},
function(callback){
callback(null,'series');
}
],function(err,results){
console.log(results);
});
console.info();
async.series()函數(shù)參數(shù)是兩個(gè) 第一個(gè)是一個(gè)函數(shù)數(shù)組 (也可以傳入一個(gè)JSON對(duì)象)纵柿,第二個(gè)參數(shù)是一個(gè)回掉函數(shù),用來把前邊的函數(shù)數(shù)組的參數(shù)打印出來
console.info([data], [...])
接收參數(shù):
接受若干個(gè)參數(shù)律适,如果只有一個(gè)參數(shù)违寿,則輸出這個(gè)參數(shù)的字符串形式萧豆。
如果有多個(gè)參數(shù)籍救,則以類似于C語言printf()命令的格式輸出。
如果沒有參數(shù)污茵,只打印一個(gè)換行符
下面這個(gè)例子是傳 json數(shù)據(jù)格式的函數(shù)組
var async = require('async');
async.series({
one:function(callback){
callback(null,'hello');
},
two:function(callback){
callback(null,'async');
},
three:function(callback){
callback(null,'results');
}
},function(err,results){
console.log(results);
});
console.info();
4.Async瀑布模式流程控制
console.info();
var async = require('async');
async.waterfall([
function(callback){
callback(null,1);
},
function(data,callback){
console.info(data);
callback('test',2);
},
function(data,callback){
console.info(data);
callback(null,3);
}
],function(err,results){
console.log(results);
});
console.info();
waterfall(tasks,[callback]);
(1)第一個(gè)參數(shù)只能是數(shù)組類型
(2)回掉函數(shù)callback的第一個(gè)參數(shù)如果是非空樱报,則流程在此結(jié)束。為空時(shí)才會(huì)繼續(xù)下去省咨,所以這里輸出的是1 2
3不會(huì)出來 第二個(gè)function的第一個(gè)參數(shù)是“test”非空 則停止了肃弟。
5.async 并行流程控制
console.info();
var async = require('async');
async.parallel([
function(callback){
setTimeout(function(){
callback(null,'one');
},2000);
},
function(callback){
setTimeout(function(){
callback(null,'two');
},1000);
}
],
function(err,results){
console.log(results);
});
console.info()
并行:兩個(gè)或兩個(gè)以上的事件或者活動(dòng)在同一時(shí)刻發(fā)生
async.paralle()函數(shù)就是并行執(zhí)行多個(gè)函數(shù)
paralle(tasks,[callback]);
第一個(gè)參數(shù)是一個(gè)函數(shù)數(shù)組或者json對(duì)象,類比series()函數(shù)
第二個(gè)參數(shù)是一個(gè)回掉函數(shù) 用于輸出前面函數(shù)的參數(shù)
但是注意 最終得到的結(jié)果 數(shù)據(jù)的順序是在Tasks函數(shù)數(shù)組的聲明順序 而不是執(zhí)行完成的時(shí)間 所以這里輸出的是 ?['one','two'] 盡管 第二個(gè)函數(shù)更快完成
6.async限制性并行流程控制
console.info()
var async = require('async');
async.parallelLimit([
function(callback){
setTimeout(function(){
callback(null,'one');
},1000);
},
function(callback){
setTimeout(function(){
callback(null,'two');
},1000);
}
],1,function(err,results){
console.log(results);
});
console.info();
parallelLimit()與paralle()類似
不同之處在于 前者parallelLimit(tasks,limits,[callback]);
有三個(gè)參數(shù) limits表示并發(fā)任務(wù)有數(shù)量限制
7.async的循環(huán)流程控制
console.info()
var async = require('async');
var count = 0;
var list = [
{name:'Jack',age:18},
{name:'Qin',age:20},
{name:'Li',age:17},
{name:'Liu',age:22},
{name:'sun',age:19}
];
async.whilst(
function(){
return count<5;
},
function(callback){
console.log(count);
list[count].age += 1;
count++;
setTimeout(callback,1000);
},
function(err){
console.log(count);
console.log(list);
}
);
這里用到了async的循環(huán)流程控制函數(shù) whilst()
參數(shù)有 whilst(test,fn,callback);第一個(gè)參數(shù)作為循環(huán)結(jié)束的條件零蓉,第二個(gè)參數(shù)是要異步執(zhí)行的操作 第三個(gè)參數(shù)是回掉函數(shù) 輸出結(jié)果
whilst()相當(dāng)于while語句 區(qū)別在于 異步調(diào)用是在完成以后才會(huì)進(jìn)行下次循環(huán)
相關(guān)函數(shù)還有 doWhilst() until() 與 doUntil() 這里就不一一展開 請自行查閱API
8.async隊(duì)列流程控制
console.info();
var async = require('async');
//定義了隊(duì)列
var q = async.queue(function(task,callback){
console.log('worker is processing task:',task.name);
callback();
},2);
q.push({name:'foo'},function(err){
console.log('finished processing foo');
});
q.push({name:'bar'},function(err){
console.log('finished processing bar');
});
q.push({name:'egg'},function(err){
console.log('finished processing egg');
});
q.push({name:'app'},function(err){
console.log('finished processing app');
});
//當(dāng)最后一個(gè)任務(wù)被執(zhí)行的前 會(huì)執(zhí)行 q.empty
q.empty = function(){
console.log('no more tasks wating')
}
//所有任務(wù)完成的時(shí)候 會(huì)調(diào)用該函數(shù)
q.drain = function(){
console.log('all tasks have been processed');
}
async.queue(worker,concurrency)
第一個(gè)參數(shù)worker是任務(wù)的回調(diào)函數(shù)的形式笤受,當(dāng)使用push()方法時(shí),對(duì)應(yīng)的參數(shù)被傳進(jìn)去 被worker執(zhí)行
第二個(gè)參數(shù)定義了一次worker同時(shí)執(zhí)行任務(wù)的數(shù)量上限