使用 async.waterfall(tasks,function(error,result){ log(error) log(result); })并发处理数组中的每一个元素
时间: 2024-09-18 20:07:08 浏览: 29
promise-waterfall:promise-waterfall 使用顺序流控制功能扩展了 promise 实用程序,例如 async.waterfall
`async.waterfall` 是一个异步流水线函数,它允许你按照指定的顺序执行一系列异步操作。在这个上下文中,你可以将数组中的每个元素作为单独的任务(task),依次处理,形成一个并行但有序的工作流。
首先,你需要安装 `async` 模块,如果你还没有安装,可以用 npm 安装:
```bash
npm install async
```
然后,你可以像这样使用 `async.waterfall`:
```javascript
const _ = require('lodash'); // 引入 lodash 库,通常用于处理数组操作,如 map, each等
function processElementAsync(element, callback) {
// 这里模拟一个耗时操作,然后调用回调函数
setTimeout(() => {
const result = element * 2;
callback(null, result); // 第一个参数传 null 表示成功,结果传给第二个参数
}, 1000);
}
const arr = [1, 2, 3, 4, 5];
// 使用 async.waterfall 和数组的 forEach
async.waterfall(_.forEach(arr, (element, index, array) => {
async.waterfall([
(callback) => processElementAsync(element, callback),
(result, next) => { // 当前任务完成后,执行下一个任务
console.log(`Processed element ${index + 1}:`, result);
next(); // 调用 next() 传递到下一个任务
},
], () => {
// 所有任务完成后,这里会执行
console.log('All tasks completed');
});
}), (error) => {
if (error) {
console.error('Error occurred:', error);
}
});
```
在这个例子中,`async.waterfall` 内部又嵌套了一个 waterfall,每次处理完一个元素后就立即开始下一个元素的处理。这样,虽然每个元素实际上是串行地经过 `processElementAsync`,但由于它们是并发执行的,所以整体上看起来像是并行的。
阅读全文