[toc]
1 | 汇智网-异步编程:http://cw.hubwiz.com/card/c/543e1a4f032c7816c0d5dfa1/1/3/6/ |
简介
github网址:https://github.com/caolan/async
- 异步编程是指由于异步I/O等因素,无法同步获得执行结果时,在回调函数中进行下一步操作的代码编写风格,常见的如setTimeout函数、ajax请求等等
- 使用Asycn模块需要安装,它不是node自带的
1 | 安装:npm install async |
- 异常捕获:异步I/O的实现主要有两个阶段,①提交请求;②处理结果; 这两个阶段彼此不关联,而异常并不一定发生在请求提交(即调用函数)时,平常的try/catch并不能有效的捕捉到程序的异常
函数式编程
高阶函数
- 高阶函数与普通函数不同的地方是高阶函数可以把函数作为参数,或者是将函数作为返回值
- 函数作为参数;函数作为返回值;
1 | //高阶函数test的返回值是一个匿名函数 |
偏函数
- 一个创建函数的工厂函数;通过指定部分参数,定制新的函数
- 假设有一个参数或变量已经预置的函数A,我们通过调用A来产生一个新的函数B,函数B就是我们说的偏函数
1 | //isType函数中预置了判断类型的方法,只指定部分参数来产生的新的定制的函数isString和isFunction就是偏函数 |
编写偏函数
1 | var say =function(name){ |
方法说明
series
它是控制异步函数按照串行顺序执行,只有前一个执行完毕,才能执行下一个异步调用
1 | async.series([function(cb){ |
parallel
parallel的用法和series类似。只是数组中的函数是并行执行,parallel的总时间取决于运行时间最长的函数。而最终的回调函数里result的值是按照数组中函数的顺序排列的
waterfall
和series函数有很多相似之处,都是按照顺序执行。
不同之处是waterfall每个函数产生的值,都将传给下一个函数,而series则没有这个功能
1 | async.waterfall([function(cb){ |
var count = 0;
async.whilst(
function () { return count < 5; },
function (callback) {
count++;
setTimeout(callback, 1000);
},
function (err) {
}
);
1 |
|
var count = 5;
async.until(
function () { return count < 0; },
function (callback) {
count–;
setTimeout(callback, 1000);
},
function (err) {
}
);
1 |
|
var async = require(‘async’);
function fn1(n, callback) {
setTimeout(function () {
callback(null, n + 1);
}, 1000);
}
function fn2(n, callback) {
setTimeout(function () {
callback(null, n * 3);
}, 1000);
}
var demo = async.compose(fn2, fn1);
demo(4, function (err, result) {
console.log(result); //结果15
});
demo = async.compose(fn1, fn2);
demo(4, function (err, result) {
console.log(result); //结果13
});
1 |
|
async.auto({
getData: function(callback){
callback(null, ‘data’, ‘converted to array’);
},
makeFolder: function(callback){
callback(null, ‘folder’);
},
writeFile: [‘getData’, ‘makeFolder’, function(callback, results){
callback(null, ‘filename’);
}],
emailLink: [‘writeFile’, function(callback, results){
callback(null, {‘file’:results.writeFile, ‘email’:‘user@example.com’});
}]
}, function(err, results) {
console.log('err = ', err);
console.log('results = ', results);
});
1 |
|
function(callback) {
test(3, callback);
};
用apply改写:
async.apply(test, 3);
1 |
|
var iter = async.iterator([
function() { console.log(‘111’) },
function() { console.log(‘222’) },
function() { console.log(‘333’) }
]);
iter();