`
天梯梦
  • 浏览: 13729603 次
  • 性别: Icon_minigender_2
  • 来自: 洛杉矶
社区版块
存档分类
最新评论

Node.js 模块之Nimble流程控制

 
阅读更多

NodeJS异步的特性有时候会导致程序非常的难看,回调一层套着一层,这个时候就要用流程控制模块来控制究竟是同步还是异步了。

 

Nimble是一个轻量、可移植的函数式流程控制模块。经过最小化和压缩后只有837字节,可以运行在Node.js中,也可以用在各种浏览器中。它整合了underscoreasync一些最实用的功能,并且API更简单。

 

nimble有两个流程控制函数,_.parallel和_.series。顾名思义,我们要用的是第二个,可以让一组函数串行执行的_.series。下面这个命令是用来安装Nimble的:

npm install nimble

 

如果用.series调度执行上面那个解方程的函数,代码应该是这样的:

...
var flow = require('nimble');
(function calculate(i) {
    if(i === l-1) {
        variables[i] = res[i];
        process.exit();
    }else {
        flow.series([
            function (callback) {
                calculateTail(res[i],res[i+1],function(tail) {
                    variables[i] = tail;
                    callback();
                });
            },
            function (callback) {
                calculateHead(res[i],res[i+1],function(head) {
                    res[i+1] = head;
                    callback();
                });
            },
            function(callback){
                calculate(i+1);
            }]);
    }
})(0);
...

 

.series数组参数中的函数会挨个执行,只是我们的calculateTail和calculateHead都被包在了另一个函数中。尽管这个用流程控制实现的版本代码更多,但通常可读性和可维护性要强一些。

更多实例:

 

串行执行(非异步):

var flow = require('nimble');

flow.series([
    function (callback)
    {
        setTimeout(function()
        {
            console.log('I execute first.');
            callback();
            newfunc();
        }, 1000)
    },
    function (callback)
    {
        setTimeout(function()
        {
            console.log('I execute next.');
            callback();
        }, 2000)
    },
    function (callback)
    {
        setTimeout(function()
        {
            console.log('I execute last.');
            callback();
        }, 100)
    }
]);

 

并行执行(异步):

var flow = require('nimble');

flow.parallel([
    function (callback) {
        setTimeout(function () {
            console.log('one');
            callback();
        }, 25);
    },
    function (callback) {
        setTimeout(function () {
            console.log('two');
            callback();
        }, 0);
    }
]);

 

串并行兼顾(流程控制):

var flow = require('nimble');
var exec = require('child_process').exec;

function downloadNodeVersion(version, destination, callback)
{
    var url      = 'http://nodejs.org/dist/node-v' + version + '.tar.gz';
    var filepath = destination + '/' + version + '.tgz';
    exec('curl ' + url + ' > ' + filepath, callback);
}

flow.series
([
    function(callback)
    {
        flow.parallel
        ([
            function(callback)
            {
                console.log('Downloading Node v0.4.6...');
                downloadNodeVersion('0.4.6', '/tmp', callback);
            },
            function(callback)
            {
                console.log('Downloading Node v0.4.7...');
                downloadNodeVersion('0.4.7', '/tmp', callback);
            }
        ], callback);
    },
    function(callback)
    {
        console.log('Creating archive of downloading files...');
        exec
        (
            'tar cvf node_distros.tar /tmp/0.4.6.tgz /tmp/0.4.7.tgz',
            function(error, stdout, stderr)
            {
                console.log('All Done!');
                callback();
            }
        )
    }
]);

 

这个稍微解释一下:先异步下载文件,文件下载完成后,再把所有文件打包。

 

nimble.min.js

(function(a){var b=Object.keys||function(a){var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(c);return b};var c=function(a,b){var c=Array.prototype[a];return function(d,e,f){var g=d?d[a]:0;return g&&g===c?g.call(d,e,f):b(d,e,f)}};var d=c("forEach",function(a,c){var d=a instanceof Object;var e=d?b(a):a||[];for(var f=0,g=e.length;f<g;f++){var h=d?e[f]:f;c(a[h],h,a)}});var e=function(a,c,e){var f=a.length||b(a).length;if(!f)return e();var g=0;d(a,function(){var a=function(a){a?(e(a),e=function(){}):++g===f&&e()};var b=Array.prototype.slice.call(arguments);c.length?(b=b.slice(0,c.length-1),b[c.length-1]=a):b.push(a),c.apply(this,b)})};var f=function(a,c,d){var e=b(a);if(!e.length)return d();var f=0;var g=function(){var b=e[f];var h=[a[b],b,a].slice(0,c.length-1);h[c.length-1]=function(a){a?(d(a),d=function(){}):++f===e.length?d():g()},c.apply(this,h)};g()};var g=c("map",function(a,b){var c=[];d(a,function(a,d,e){c[c.length]=b(a,d,e)});return c});var h=function(a){return function(b,c,d){var e=[];a(b,function(a,b,d,f){var g=function(a,b){e[e.length]=b,f(a)};var h=[a,b,d];c.length?(h=h.slice(0,c.length-1),h[c.length-1]=g):h.push(g),c.apply(this,h)},function(a){d(a,e)})}};var i=c("filter",function(a,b,c){var e=[];d(a,function(a,c,d){b(a,c,d)&&(e[e.length]=a)});return e});var j=function(a,b,c){var d=[];e(a,function(a,c,e,f){var g=function(b,c){c&&(d[d.length]=a),f(b)};var h=[a,c,e];b.length?(h=h.slice(0,b.length-1),h[b.length-1]=g):h.push(g),b.apply(this,h)},function(a){c(a,d)})};var k=c("reduce",function(a,b,c){d(a,function(a,d,e){c=b(c,a,d,e)});return c});var l=function(a,b,c,d){f(a,function(a,d,e,f){var g=function(a,b){c=b,f(a)};var h=[c,a,d,e];b.length?(h=h.slice(0,b.length-1),h[b.length-1]=g):h.push(g),b.apply(this,h)},function(a){d(a,c)})};a.each=function(a,b,c){return(c?e:d)(a,b,c)},a.map=function(a,b,c){return(c?h(e):g)(a,b,c)},a.filter=function(a,b,c){return(c?j:i)(a,b,c)},a.reduce=function(a,b,c,d){return(d?l:k)(a,b,c,d)},a.parallel=function(a,b){var c=new a.constructor;e(a,function(a,b,d){a(function(a){var e=Array.prototype.slice.call(arguments,1);c[b]=e.length<=1?e[0]:e,d(a)})},function(a){(b||function(){})(a,c)})},a.series=function(a,b){var c=new a.constructor;f(a,function(a,b,d){a(function(a,e){var f=Array.prototype.slice.call(arguments,1);c[b]=f.length<=1?f[0]:f,d(a)})},function(a){(b||function(){})(a,c)})}})(typeof exports==="undefined"?this._=this._||{}:exports)

 

更多内容可以参考官网:http://caolan.github.io/nimble/

 

本文转自:Node.js 模块之Nimble流程控制

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    nrf52832-nimble 代码分析流程图.pdf

    《nrf52832-nimble 代码分析流程图详解》 nrf52832-nimble是一个基于nRF52832芯片实现的蓝牙协议栈开源项目,其代码流程图深入剖析了蓝牙通信的核心过程,包括广播、扫描、连接、配对以及各层次的数据交互。本文将...

    NIMBLE

    8. 协作与分享:如果Nimble是一款团队协作工具,那么它可能包含协作功能,如版本控制、评论和共享设计,促进团队间的合作。 9. 教程和资源:为了帮助用户提升技能,Nimble可能提供教程、示例和灵感库,帮助设计师...

    ZenPacks.community.Nimble:ZenPacks.community.Nimble

    ZenPack管理Nimble存储阵列描述当前,这是一个BETA ZENPACK。 仅应将其安装在测试环境中!!! 该ZenPack用于使用SNMP协议管理Nimble存储阵列。 使用新的组件类型创建新的灵活设备类型来表示卷。 Nimble MIB(1.3....

    nimble.js:使用API​​构建Web或移动应用程序的最快方法

    Nimble.js依赖于两个流行的框架和 ,它是可扩展的,可以与许多JavaScript / CSS框架一起使用。 我们的是一组在线表格。 这些形式允许按顺序或并行集成多个API请求。 这些请求将转换为单个JSON / XML终结点。 您可以...

    nimble-quest-tf-agent:创建敏捷任务AI Bot。 https:store.steampowered.comapp259780Nimble_Quest

    《nimble-quest-tf-agent:使用Python构建敏捷任务AI Bot》 nimble-quest-tf-agent 是一个基于Python的项目,旨在帮助开发者创建能够执行敏捷任务的智能机器人,特别适用于游戏环境,如Steam平台上的《Nimble Quest...

    HPE-Nimble-Storage_viso图标

    9. **扩展性与可管理性**: 通过简单的模块化设计,Nimble Storage能够轻松扩展容量和性能,同时其直观的管理界面使得日常操作和监控变得简单。 以上就是关于“HPE-Nimble-Storage_viso图标”所涉及的关键知识点,...

    Nimble产品客户胶片

    - 即使遇到硬件故障或维护操作,如控制器故障、更换、升级或自动切换,Nimble的存储性能下降为0%。 2. **快** - 打破了性能与磁盘数量之间的绑定关系。 - 通过使用少量SSD与HDD结合的方式,Nimble能够实现高达十...

    nimble硬件安装维护手册

    Nimble硬件安装和维护手册pdf版本,转成word版本的也在附件中 启动器组 Groups 62 iSCSI启动器组 Groups 62 创建 iSCSI启动器组 Group 62 编辑 iSCSI启动器组 Group 63 删除 iSCSI启动器组 63 将启动器添加到 iSCSI...

    Nimble Storage解决方案详解.pptx

    Nimble Storage解决方案详解.pptx

    PyPI 官网下载 | mypy-boto3-nimble-1.17.97.tar.gz

    标题中的"PyPI 官网下载 | mypy-boto3-nimble-1.17.97.tar.gz"指的是从Python Package Index (PyPI) 官方网站上下载的一个压缩包文件,名为 "mypy-boto3-nimble-1.17.97.tar.gz"。PyPI是Python社区的中央仓库,它...

    PyPI 官网下载 | mypy-boto3-nimble-1.18.44.tar.gz

    《PyPI官网下载:mypy-boto3-nimble-1.18.44.tar.gz详解》 PyPI(Python Package Index)是Python开发者最常用的一个资源库,它提供了大量的Python软件包供用户下载和使用。本次我们将深入探讨一个在PyPI官网下载的...

    Python库 | mypy-boto3-nimble-1.18.29.tar.gz

    《深入解析mypy-boto3-nimble-1.18.29:Python库的高效实践》 在Python的世界里,高效的开发工具和库是推动项目进展的关键。本篇文章将详细探讨`mypy-boto3-nimble-1.18.29`这一Python库,它整合了mypy、boto3和...

    nimPkg:加速的nimble源方便中国用户使用nim(使用GlobalSSH加速)

    nimPkg GIT加速利用加速源解决nim包管理器nimble git clone过慢的问题本仓库PackageList会每小时与官方同步使用方法推荐使用工具链unimcli自动链接加速源nimble install unimcli 然后: unim install pkgname 其他...

    Nimble, 核心数据和iCloud灵活快速.zip

    Nimble, 核心数据和iCloud灵活快速 灵活核心数据( iCloud ) 灵活快速和快速。不幸的是,我没有时间主动维护这个框架了。 如果你有问题或者想添加新功能,请打开拉请求,我将考虑合并它。为什么答案很简单。 我需要一...

    Python库 | mypy_boto3_nimble-1.17.73-py3-none-any.whl

    这段代码展示了如何使用`mypy_boto3_nimble`来访问Nimble Studio服务,并列出所有工作流程。 总的来说,`mypy_boto3_nimble`是Boto3和`mypy`的有力结合,旨在提升开发者的代码质量和效率,特别是在处理AWS服务时。...

    Nimble2:Wolfram |Alpha:registered:菜单栏应用程序

    全新的Nimble。 macOS菜单栏中的SeamlessWolfram-Alpha:registered:。 “菜单栏客户端与Web界面一样直观,这意味着它易于使用...” – “ Nimble可以处理您通常在Wolfram Alpha上所扔的任何东西……” – 安装...

    nimble 开源蓝牙协议栈

    NimBLE 软件包是 RT-Thread 基于 Apache NimBLE 开源蓝牙 5.0 协议栈的移植实现,该协议栈提供完整的 Host 层和 Controller 层支持,目前支持 Nordic nRF51 和 nRF52 系列芯片。

    nimble, Nim编程语言的软件包管理器.zip

    nimble, Nim编程语言的软件包管理器 敏捷是一个面向服务的测试工具,-grade包管理器,用于 Nim编程语言 。对学习如何创建包有兴趣。 直接跳到这里的 。电子邮件内容要求安装工具灵活的使用速度灵活的刷新功能灵活...

    PyPI 官网下载 | mypy-boto3-nimble-1.19.7.tar.gz

    《PyPI官网下载:mypy-boto3-nimble-1.19.7.tar.gz——深入了解Python库的构建与使用》 PyPI(Python Package Index)是Python开发者的重要资源库,它为全球的Python开发者提供了无数的第三方库,极大地丰富了...

Global site tag (gtag.js) - Google Analytics