nodejs异步---Async
一:異步基礎(chǔ)
1.由于node.js天生就是異步,所以效率很高,性能強。
console.log('hi!');
setTimeout(function(){
console.log('hello!');
},1000);
console.log('wow!');
比如這個,輸出結(jié)果:hi
wow!
hello!
可以看出nodejs的異步性
2.高階函數(shù)
高階函數(shù)給我的感覺就是閉包。
function test(a){
return function(b){
return a+b;
}
}
var q=test(2)(3);
console.log(q);
返回值是一個函數(shù),函數(shù)作為參數(shù)傳遞。
3.偏函數(shù)----------個人理解就是閉包
假設(shè)有一個參數(shù)或變量已經(jīng)預置的函數(shù)A,我們通過調(diào)用A來產(chǎn)生一個新的函數(shù)B,函數(shù)B就是我們說的偏函數(shù)
function test(a){
return function(b){
console.log(a+" say "+b);
}
}
var q=test("tom")("hello");
偏函數(shù):一個創(chuàng)建函數(shù)的工廠函數(shù);通過指定部分參數(shù),定制新的函數(shù)。
但是兩個都是閉包的一種。
二.Async異步
首先安裝async-----這個就不多說
npm install async
1.series(tasks,callback)
var async=require("async");
async.series({
one: function(callback){
callback(null,1) ;
},
two: function(callback){
callback(null,2) ;
}
},function(err, results) {
console.log(results)
});
這樣會按照寫入順序依次執(zhí)行各個函數(shù),結(jié)果是一個集合{ one: 1, two: 2 }
注意:series函數(shù)的第一個參數(shù)可以是一個數(shù)組也可以是一個JSON對象,參數(shù)類型不同,影響的是返回數(shù)據(jù)的格式
2,waterfall(tasks,callback)
var async=require("async");
async.waterfall([
function(callback){
//task1
callback(null,1);
},function(data,callback){
console.log(data);
callback(null,2);
}
],function(err,results){
console.log(results);
});
和series()函數(shù)一樣,會依次執(zhí)行各個函數(shù),但是每一個函數(shù)執(zhí)行成功后產(chǎn)生的值傳給下一個函數(shù),而不是results
注意:waterfall的tasks參數(shù)只能是數(shù)組類型。
3.parallel函數(shù)(tasks,callback)
var async=require("async");
async.parallel([
function(callback){
callback(null, 'one');
},
function(callback){
callback(null, 'two');
}
],
function(err, results){
console.log(results);
});
parallel函數(shù)是并行執(zhí)行多個函數(shù),每個函數(shù)都是立即執(zhí)行,不需要等待其它函數(shù)先執(zhí)行。 傳給最終callback的數(shù)組中的數(shù)據(jù)按照tasks中聲明的順序,而不是執(zhí)行完成的順序
注意:tasks參數(shù)可以是一個數(shù)組或是json對象,和series函數(shù)一樣,tasks參數(shù)類型不同,返回的results格式會不一樣。
4.parallelLimit(tasks,limit,callback)
var async=require("async");
async.parallelLimit([
function(callback){
setTimeout(function(){
callback(null, 'one');
}, 3000);
},
function(callback){
setTimeout(function(){
callback(null, 'two');
}, 1000);
}
],
2,//設(shè)置同時執(zhí)行的函數(shù)個數(shù)
function(err, results){
console.log(results);
});
如果limit是1的話,那么4S執(zhí)行完畢,如果limit是2,那么3S解決完畢。
5.whilst(test,fn,callback)
test參數(shù)是一個返回布爾值結(jié)果的函數(shù),通過返回值來決定循環(huán)是否繼續(xù),作用等同于while循環(huán)停止的條件.
var async = require('async');
var j = 0;
async.whilst(
function(){
return j<3;
},
function(callback){//記得此處應該有回調(diào)函數(shù)
j++;
console.log('whileCb'+j);
callback();
},
function(err){
}
)
callback()就是達到了條件就會循環(huán)。
6.iterator(tasks)
var iter = async.iterator([
function(){console.log('111');},
function(){console.log('222');},
function(){console.log('333');}
]);
var it1 = iter();
it1();
說一下async里的回調(diào)函數(shù),并非由使用者指定。
比如series()可改寫為
fs.readFile("1.txt",'utf-8',function(err,content){
if(err){
return callback(err);
}
fs.readFile("2.txt",'utf-8',function (err,data) {
if(err){
return callback(err);
}
callback(null,[content,data]);
})
}
本博客相當于課程筆記吧!
/*async課程:http://www//com/course/543e1a4f032c7816c0d5dfa1
//內(nèi)容是.hubwiz.
*/
總結(jié)
以上是生活随笔為你收集整理的nodejs异步---Async的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 徐坤用话剧震了我们一道
- 下一篇: 微博控的救赎