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.
*/