`
rensanning
  • 浏览: 3549311 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
Efef1dba-f7dd-3931-8a61-8e1c76c3e39f
使用Titanium Mo...
浏览量:38165
Bbab2146-6e1d-3c50-acd6-c8bae29e307d
Cordova 3.x入门...
浏览量:607357
C08766e7-8a33-3f9b-9155-654af05c3484
常用Java开源Libra...
浏览量:682394
77063fb3-0ee7-3bfa-9c72-2a0234ebf83e
搭建 CentOS 6 服...
浏览量:89392
E40e5e76-1f3b-398e-b6a6-dc9cfbb38156
Spring Boot 入...
浏览量:401877
Abe39461-b089-344f-99fa-cdfbddea0e18
基于Spring Secu...
浏览量:69709
66a41a70-fdf0-3dc9-aa31-19b7e8b24672
MQTT入门
浏览量:91733
社区版块
存档分类
最新评论

async.js中waterfall、series、parallel的区别

 
阅读更多
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-parallel-example:async.js 的并行方法调用 Web 服务的示例

    首先,`async.js`库提供了多种处理异步操作的方法,包括串行(series)、并行(parallel)、Waterfall等。在这个“async-parallel-example”中,我们将关注并行方法,它允许我们在不影响主线程的情况下同时运行多个...

    Asyncjsnode和浏览器异步工具

    Async.js 包含了一套完整的控制流函数,如 `waterfall`, `series`, `parallel`。`waterfall` 函数用于顺序执行多个函数,每个函数的输出作为下一个函数的输入;`series` 函数用于按顺序执行任务数组,所有任务都...

    JavaScript中使用Async实现异步控制

    下面我们将深入探讨`async`库中的几个核心函数:`map`、`filter`、`parallel`、`series`以及`waterfall`。 1. `async.map` `async.map`函数用于对数组中的每个元素执行一个异步函数,并将结果收集到一个新的数组中...

    浅谈node.js中async异步编程

    在本文中,提到了async库中的几个关键流程控制函数,包括series、waterfall、parallel和parallelLimit。 - series函数用于顺序执行一系列异步任务。每个任务完成后,才执行下一个任务。这种方式的函数参数可以是...

    Nodejs异步流程框架async的方法

    Node.js异步流程框架async是处理并发和流程控制的关键库,尤其在处理大量I/O操作时,能够有效地组织代码逻辑,提高程序效率。Async库提供了一系列的函数来帮助开发者更优雅地管理异步操作,避免回调地狱的问题。下面...

    Node.js掠影

    为了解决这个问题,Node.js社区发展了一系列解决方案,包括使用`eventproxy`来解耦事件处理逻辑,以及引入`async`库提供的控制流辅助函数(如`series`, `waterfall`, `parallel`等)。此外,`Q`库提供了基于Promise...

    浅析node Async异步处理模块用例分析及常用方法介绍

    Node.js中的异步编程是其核心特性之一,但由于JavaScript的单线程模型,当涉及到大量异步操作时,如调用多个API接口,传统的回调函数嵌套方式(回调地狱)会使得代码难以理解和维护。为了解决这个问题,出现了Async...

    Javascript异步编程async实现过程详解

    总的来说,`async`库通过提供丰富的异步控制结构,如`map`、`filter`、`parallel`、`series`和`waterfall`等,极大地简化了JavaScript异步编程,提高了代码的可读性和可维护性。理解和掌握这些工具对于编写高效的...

    node_modules(async+node-inspector+tap).zip

    `async`提供了一系列实用的函数,如`waterfall`(级联调用)、`series`(串行执行)、`parallel`(并行执行)以及`map`、`each`等,帮助开发者更方便地管理和组织异步操作,避免回调地狱,提高代码可读性和可维护性...

    node.js中实现同步操作的3种实现方法

    `async`库提供了丰富的API,如并行执行(`parallel`)、限制并发(`eachLimit`)、水龙头模式(`waterfall`)等,可以根据实际需求灵活选择。 总结来说,Node.js中的同步操作可以通过回调函数、递归调用或者使用第...

    nodejs使用async模块同步执行的方法

    这时,`async`模块通过提供`series`、`parallel`、`each`、`map`、` waterfall`等方法,可以帮助开发者更好地组织和执行异步代码,使得异步代码的书写和维护变得更加简洁和直观。 例如,在`series`的使用中,如果...

    前端开源库-async-promises

    `async`库是JavaScript社区中广泛使用的工具,它提供了多种处理异步操作的方法,如waterfall、series、parallel等。这些方法允许开发者以同步的方式编写异步代码,极大地提高了代码的可读性和可维护性。`async-...

    uclogs-async

    Async 提供了大约 20 个函数,包括通常的“功能性”嫌疑人( map 、 reduce 、 filter 、 each ...)以及异步控制流的一些常见模式( parallel 、 series 、 waterfall ...)。 所有这些函数都假定您遵循 Node.js ...

    深入学习nodejs中的async模块的使用方法

    async模块具有很多实用的方法,其中包括series、parallel、 waterfall、each、map、filter、some、every、detect、sortBy、reduce等。 首先,async模块可以通过npm进行安装,使用命令`npm install async`,然后在...

    NodeJS如何实现同步的方法示例

    此外,`async`库还提供了其他方法,如`parallel`(并行执行任务)、`waterfall`(瀑布式执行,每个任务的输出作为下一个任务的输入)等,帮助开发者更好地组织异步代码。 总结起来,Node.js中的同步实现主要依赖于...

    async-examples:Nodejstr 文章示例

    Async 提供了大约 20 个函数,包括通常的“功能性”可疑对象( map 、 reduce 、 filter 、 each ...)以及异步控制流的一些常见模式( parallel 、 series 、 waterfall ...)。 所有这些函数都假定您遵循 Node.js...

    我用的一些Node.js开发工具、开发包、框架等总结

    5. **Async**:处理异步操作的库,提供多种控制流程函数,如waterfall、parallel、series等。 6. **Shortid**:生成短而唯一的ID,适用于URL友好标识。 7. **Log4js**:提供日志记录功能,对于开发和调试非常有用...

Global site tag (gtag.js) - Google Analytics