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