test_waterfall1.js
var async = require('async');
// waterfall Test 1
// 参数: task数组、task全部完成后的最终函数.
// 将数组中的task按顺序执行,没有调用callback的话不会执行下一个task
// callback 第一个参数是error,第二个以后的参数传递给下一个task
async.waterfall([
function(callback) {
console.log("---------- task 1 ----------");
callback(null, '111', '222');
},
function(arg1, arg2, callback) {
console.log("---------- task 2 ----------");
console.log("arg1=" + arg1 + " arg2=" + arg2);
callback(null, '333');
},
function(arg3, callback) {
console.log("---------- task 3 ----------");
console.log("arg3=" + arg3);
callback(null, '444');
}
], function (err, result) {
if (err) {
console.log("something is wrong");
} else {
console.log("all the functions have completed");
}
console.log("err=" + err);
console.log("result=" + result);
});
/*
D:\asyncsample>node test_waterfall1.js
---------- task 1 ----------
---------- task 2 ----------
arg1=111 arg2=222
---------- task 3 ----------
arg3=333
all the functions have completed
err=null
result=444
*/
test_waterfall2.js
var async = require('async');
// waterfall Test 2
// callback 第一个参数如果不为null,将跳过之后的所有task直接执行最终函数
async.waterfall([
function(callback) {
console.log("---------- task 1 ----------");
callback(null, '111', '222');
},
function(arg1, arg2, callback) {
console.log("---------- task 2 ----------");
console.log("arg1=" + arg1 + " arg2=" + arg2);
callback("ERROR TEST", '333'); // !!!!!pass an error to callback, the next function is not executed
},
function(arg3, callback) {
console.log("---------- task 3 ----------");
console.log("arg3=" + arg3);
callback(null, '444');
}
], function (err, result) {
if (err) {
console.log("something is wrong");
} else {
console.log("all the functions have completed");
}
console.log("err=" + err);
console.log("result=" + result);
});
/*
D:\asyncsample>node test_waterfall2.js
---------- task 1 ----------
---------- task 2 ----------
arg1=111 arg2=222
something is wrong
err=ERROR TEST
result=333
*/
test_waterfall3.js
var async = require('async');
// waterfall Test 3
// 如果某个task中没有调用下一个task,以后的所有处理都不会被执行(包括最终函数)
async.waterfall([
function(callback) {
console.log("---------- task 1 ----------");
callback(null, '111', '222');
},
function(arg1, arg2, callback) {
console.log("---------- task 2 ----------");
console.log("arg1=" + arg1 + " arg2=" + arg2);
//callback(null, '333'); // !!!
},
function(arg3, callback) {
console.log("---------- task 3 ----------");
console.log("arg3=" + arg3);
callback(null, '444');
}
], function (err, result) {
if (err) {
console.log("something is wrong");
} else {
console.log("all the functions have completed");
}
console.log("err=" + err);
console.log("result=" + result);
});
/*
D:\asyncsample>node test_waterfall3.js
---------- task 1 ----------
---------- task 2 ----------
arg1=111 arg2=222
*/
test_waterfall.js
var async = require('async');
// waterfall
// http://caolan.github.io/async/docs.html#waterfall
async.waterfall([
function(callback) {
console.log("---------- task 1 ----------");
setTimeout(function() {
console.log('task 1 done');
callback(null, '111', '222');
}, 100);
},
function(arg1, arg2, callback) {
console.log("---------- task 2 ----------");
console.log("arg1=" + arg1 + " arg2=" + arg2);
setTimeout(function() {
console.log('task 2 done');
callback(null, '333');
}, 50);
},
function(arg3, callback) {
console.log("---------- task 3 ----------");
console.log("arg3=" + arg3);
setTimeout(function() {
console.log('task 3 done');
callback(null, '444');
}, 10);
}
], function (err, result) {
console.log("---------- all done ----------");
console.log("err=" + err);
console.log("result=" + result);
});
/*
D:\asyncsample>node test_waterfall.js
---------- task 1 ----------
task 1 done
---------- task 2 ----------
arg1=111 arg2=222
task 2 done
---------- task 3 ----------
arg3=333
task 3 done
---------- all done ----------
err=null
result=444
*/
test_series.js
var async = require('async');
// series
// http://caolan.github.io/async/docs.html#series
// 和watarfall相同,也是按顺序执行数组里的task,没有调用到callback不会执行下一个task
// 不同的是:所有的task只有一个参数callback。所有往下传递的参数都会被放入最终函数的数组results里
async.series([
function(callback) {
console.log("---------- task 1 ----------");
setTimeout(function() {
console.log('task 1 done');
callback(null, '111', '222');
}, 100);
},
function(callback) {
console.log("---------- task 2 ----------");
setTimeout(function() {
console.log('task 2 done');
callback(null, '333');
}, 50);
},
function(callback) {
console.log("---------- task 3 ----------");
setTimeout(function() {
console.log('task 3 done');
callback(null, '444');
}, 10);
}
], function (err, results) {
console.log("---------- all done ----------");
console.log("err=" + err);
console.log(results);
});
/*
D:\asyncsample>node test_series.js
---------- task 1 ----------
task 1 done
---------- task 2 ----------
task 2 done
---------- task 3 ----------
task 3 done
---------- all done ----------
err=undefined
[ [ '111', '222' ], '333', '444' ]
*/
test_parallel.js
var async = require('async');
// parallel
// http://caolan.github.io/async/docs.html#parallel
// 和series/waterfall不同,task是并列执行的,callback不是执行下一个task。
// 和series一样,参数都会被放入最终函数的数组results里
async.parallel([
function(callback) {
console.log("---------- task 1 ----------");
setTimeout(function() {
console.log('task 1 done');
callback(null, '111', '222');
}, 100);
},
function(callback) {
console.log("---------- task 2 ----------");
setTimeout(function() {
console.log('task 2 done');
callback(null, '333');
}, 50);
},
function(callback) {
console.log("---------- task 3 ----------");
setTimeout(function() {
console.log('task 3 done');
callback(null, '444');
}, 10);
}
], function (err, results) {
console.log("---------- all done ----------");
console.log("err=" + err);
console.log(results);
});
/*
D:\asyncsample>node test_parallel.js
---------- task 1 ----------
---------- task 2 ----------
---------- task 3 ----------
task 3 done
task 2 done
task 1 done
---------- all done ----------
err=undefined
[ [ '111', '222' ], '333', '444' ]
*/
test_parallel_obj.js
var async = require('async');
// parallel
// 并行处理的第一个参数可以是一个对象,最终函数的参数也不是数组而是一个带key的对象
async.parallel({
first: function(callback) {
console.log("---------- task 1 ----------");
setTimeout(function() {
console.log('task 1 done');
callback(null, '111', '222');
}, 100);
},
second: function(callback) {
console.log("---------- task 2 ----------");
setTimeout(function() {
console.log('task 2 done');
callback(null, '333');
}, 50);
},
third: function(callback) {
console.log("---------- task 3 ----------");
setTimeout(function() {
console.log('task 3 done');
callback(null, '444');
}, 10);
}
}, function (err, result) {
console.log("---------- all done ----------");
console.log("err=" + err);
console.log(result);
});
/*
D:\asyncsample>node test_parallel_obj.js
---------- task 1 ----------
---------- task 2 ----------
---------- task 3 ----------
task 3 done
task 2 done
task 1 done
---------- all done ----------
err=undefined
{ third: '444', second: '333', first: [ '111', '222' ] }
*/
分享到:
相关推荐
首先,`async.js`库提供了多种处理异步操作的方法,包括串行(series)、并行(parallel)、Waterfall等。在这个“async-parallel-example”中,我们将关注并行方法,它允许我们在不影响主线程的情况下同时运行多个...
Async.js 包含了一套完整的控制流函数,如 `waterfall`, `series`, `parallel`。`waterfall` 函数用于顺序执行多个函数,每个函数的输出作为下一个函数的输入;`series` 函数用于按顺序执行任务数组,所有任务都...
下面我们将深入探讨`async`库中的几个核心函数:`map`、`filter`、`parallel`、`series`以及`waterfall`。 1. `async.map` `async.map`函数用于对数组中的每个元素执行一个异步函数,并将结果收集到一个新的数组中...
在本文中,提到了async库中的几个关键流程控制函数,包括series、waterfall、parallel和parallelLimit。 - series函数用于顺序执行一系列异步任务。每个任务完成后,才执行下一个任务。这种方式的函数参数可以是...
Node.js异步流程框架async是处理并发和流程控制的关键库,尤其在处理大量I/O操作时,能够有效地组织代码逻辑,提高程序效率。Async库提供了一系列的函数来帮助开发者更优雅地管理异步操作,避免回调地狱的问题。下面...
为了解决这个问题,Node.js社区发展了一系列解决方案,包括使用`eventproxy`来解耦事件处理逻辑,以及引入`async`库提供的控制流辅助函数(如`series`, `waterfall`, `parallel`等)。此外,`Q`库提供了基于Promise...
Node.js中的异步编程是其核心特性之一,但由于JavaScript的单线程模型,当涉及到大量异步操作时,如调用多个API接口,传统的回调函数嵌套方式(回调地狱)会使得代码难以理解和维护。为了解决这个问题,出现了Async...
总的来说,`async`库通过提供丰富的异步控制结构,如`map`、`filter`、`parallel`、`series`和`waterfall`等,极大地简化了JavaScript异步编程,提高了代码的可读性和可维护性。理解和掌握这些工具对于编写高效的...
`async`提供了一系列实用的函数,如`waterfall`(级联调用)、`series`(串行执行)、`parallel`(并行执行)以及`map`、`each`等,帮助开发者更方便地管理和组织异步操作,避免回调地狱,提高代码可读性和可维护性...
`async`库提供了丰富的API,如并行执行(`parallel`)、限制并发(`eachLimit`)、水龙头模式(`waterfall`)等,可以根据实际需求灵活选择。 总结来说,Node.js中的同步操作可以通过回调函数、递归调用或者使用第...
这时,`async`模块通过提供`series`、`parallel`、`each`、`map`、` waterfall`等方法,可以帮助开发者更好地组织和执行异步代码,使得异步代码的书写和维护变得更加简洁和直观。 例如,在`series`的使用中,如果...
`async`库是JavaScript社区中广泛使用的工具,它提供了多种处理异步操作的方法,如waterfall、series、parallel等。这些方法允许开发者以同步的方式编写异步代码,极大地提高了代码的可读性和可维护性。`async-...
Async 提供了大约 20 个函数,包括通常的“功能性”嫌疑人( map 、 reduce 、 filter 、 each ...)以及异步控制流的一些常见模式( parallel 、 series 、 waterfall ...)。 所有这些函数都假定您遵循 Node.js ...
async模块具有很多实用的方法,其中包括series、parallel、 waterfall、each、map、filter、some、every、detect、sortBy、reduce等。 首先,async模块可以通过npm进行安装,使用命令`npm install async`,然后在...
此外,`async`库还提供了其他方法,如`parallel`(并行执行任务)、`waterfall`(瀑布式执行,每个任务的输出作为下一个任务的输入)等,帮助开发者更好地组织异步代码。 总结起来,Node.js中的同步实现主要依赖于...
Async 提供了大约 20 个函数,包括通常的“功能性”可疑对象( map 、 reduce 、 filter 、 each ...)以及异步控制流的一些常见模式( parallel 、 series 、 waterfall ...)。 所有这些函数都假定您遵循 Node.js...
5. **Async**:处理异步操作的库,提供多种控制流程函数,如waterfall、parallel、series等。 6. **Shortid**:生成短而唯一的ID,适用于URL友好标识。 7. **Log4js**:提供日志记录功能,对于开发和调试非常有用...