async中流程控制的applyEach,applyEachSeries,compose, during的用法

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
/*async的流程控制*/
const async = require('async');
const fs = require('fs');
const util = require('util');

//测试用例函数
function showName(person, callback) {
    if ('name' in person) {
        //等待5秒以后开始执行操作,仍然是异步
        var id = setTimeout(function () {
            console.log('person_name:' + person.name);
            if (callback) {
                callback();
            }
        }, 5000);
        console.log('异步执行开始启动:等待5s, id=' + id);
    }
}

function showAge(person, callback) {
    if ('age' in person) {
        console.log('person_age:' + person.age);
        if (callback) {
            callback();
        }
    }
}

//异步流程控制测试类
function AsyncControlFlowTest() {

}

AsyncControlFlowTest.prototype = {
    //根据列出的函数来自动计算依赖关系,并根据依赖关系来执行异步操作
    //包含完整的数据流转,可以控制数据在每个处理过程中的结果保留
    //参数说明 auto({fnname1:fn1, fnname2:fn2, fnname3:[fn1, fn2, fn3],...}, callback)
    //fn之间可以具备依赖关系
    //fn的原型 (callback),调用callback(err, result),数据都以函数名称作为键值来保存数据结果
    //callback(err, reuslt),数据结果
    auto: function () {
        //async.auto({
        //    // this function will just be passed a callback
        //    readData: async.apply(fs.readFile, 'data.txt', 'utf-8'),
        //    showData: ['readData', function(results, cb) {
        //        // results.readData is the file's contents
        //        // ...
        //    }]
        //}, callback);
        async.auto({
            get_data: function (callback) {
                //这种会阻塞整个程序,这样不行
                //for(var i=0; i<10000000000; ++i);

                console.log('in get_data');
                // async code to get some data
                callback(null, 'data', 'converted to array');
            },
            make_folder: function (callback) {
                console.log('in make_folder');
                // async code to create a directory to store a file in
                // this is run at the same time as getting the data
                callback(null, 'folder');
            },
            write_file: ['get_data', 'make_folder', function (results, callback) {
                //console.log('results:' + util.inspect(results,true));
                console.log('in write_file', JSON.stringify(results));
                // once there is some data and the directory exists,
                // write the data to a file in the directory
                callback(null, 'filename');
            }],
            email_link: ['write_file', function (results, callback) {
                console.log('in email_link', JSON.stringify(results));
                // once the file is written let's email a link to it...
                // results.write_file contains the filename returned by write_file.
                callback(null, {'file': results.write_file, 'email': 'user@example.com'});
            }]
        }, function (err, results) {
            console.log('err = ', err);
            console.log('results = ', results);
        });
    },

    //根据依赖项来计算依赖关系,依赖关系以回调函数参数的形式来进行表示
    //参数说明 autoInject({fnname1:fn1, fnname2:fn2,[fn1, fn2, fnname3,fn3],...}, callback)
    //fn之间可以设定各种依赖关系
    //fn1的原型 (callback),调用callback的方式 callback(err, result1, result2, result3)
    //最后输出结果在result.fnname1中,以Array的形式来表现
    //callback (err, result) result包含了当前整个管道中所有的结果数据,执行完成auto调用该函数
    autoInject: function () {
        //  The example from `auto` can be rewritten as follows:
        //注入模式直接将依赖关系的函数结果作为了输入项
        async.autoInject({
            get_data: function (callback) {
                // async code to get some data
                callback(null, 'data', 'converted to array');
            },
            make_folder: function (callback) {
                // async code to create a directory to store a file in
                // this is run at the same time as getting the data
                callback(null, 'folder');
            },
            //这种注入方式必须要将参数的名称写正确了,参数的名称需要和函数的名称保持一致,
            //这样通过arguments就可以解析出函数的名称,就可以自动的计算出依赖关系了
            write_file: function (get_data, make_folder, callback) {
                // once there is some data and the directory exists,
                // write the data to a file in the directory
                console.log('arguments=' + console.log(util.inspect(arguments.callee.arguments, true)));
                console.log(util.inspect(get_data, true));
                console.log(util.inspect(make_folder, true));
                callback(null, 'filename');
            },
            email_link: function (write_file, callback) {
                // once the file is written let's email a link to it...
                // write_file contains the filename returned by write_file.
                callback(null, {'file': write_file, 'email': 'user@example.com'});
            }
        }, function (err, results) {
            console.log('err = ', err);
            console.log('email_link = ', results.email_link);
        });
    },

    //以参数的形式来计算依赖关系的另外一种表现形式
    //参数说明 autoInject({fnname1:fn1, fnname2:fn2,[fn1, fn2, fnname3,fn3],...}, callback)
    //fn之间可以设定各种依赖关系
    //fn1的原型 (callback),调用callback的方式 callback(err, result1, result2, result3)
    //最后输出结果在result.fnname1中,以Array的形式来表现
    //callback (err, result) result包含了当前整个管道中所有的结果数据,执行完成auto调用该函数
    autoInject2: function () {
        //callback回调函数callback(err, result),多个result会以数组的形式来提供
        async.autoInject({
            //...
            get_data: function (callback) {
                callback(null, 'data', 'convert to array');
            },
            make_folder: function (callback) {
                callback(null, 'make_folder');
            },
            //另外一种书写格式,这样写,回调函数的参数就不再是依赖项了,数组前面的最几个数据
            //描述的是依赖的函数,最后一个回调函数会将前几个依赖项的结果作为输入
            //怎么感觉很有管道的味道哦!!!!
            write_file: ['get_data', 'make_folder', function (get_data_arg, make_folder_arg, callback) {
                console.log('get_data:' + util.inspect(get_data_arg, true));
                console.log('make_folder' + util.inspect(make_folder_arg, true));

                callback(null, 'filename');
            }],
            email_link: ['write_file', function (write_file, callback) {
                callback(null, {'file': write_file, 'email': 'user@example.com'});
            }]
            //...
        }, function (err, results) {
            console.log('err = ', err);
            console.log('email_link = ', results.email_link);
        });
    },

    //货物处理,这个方法和queue的区别在于,cargo只有一个工作函数,该工作函数可以一次传入多个工作对象
    //而queue是会启动多个工作函数,多个工作函数同时异步工作
    //参数说明 cargo(function(task, callback), taskNum)
    //taskNum是异步函数一次能处理的数据量
    //task是一个数组
    cargo: function () {
        cargoObj = async.cargo(function (task, callback) {
            for (var i = 0; i < task.length; ++i) {
                console.log('当前的任务:' + task[i].name);
            }

            for (var i = 0; i < 1000000000; ++i);
            callback();
        }, 3);

        for (var i = 0; i < 7; ++i) {
            cargoObj.push({name: 'target' + i});
        }
    },

    //把一个输入数据,应用给每一个函数去分别异步并发执行
    //参数说明 applyEach(collection, input, callback)
    //collection是一个集合,用来存储所有要分别执行的函数,每个函数都是 (input, callback),需要在函数中调用callback
    //input 是输入数据
    //callback 是所有的事情都完成以后会调用callback,无任何参数()
    applyEach: function () {
        async.applyEach([showName, showAge,], {name: 'async', age: '18'}, function () {
            console.log('完成所有的异步操作');
        });
    },

    //把一个输入数据,应用给每一个函数去分别依次去执行
    //参数说明 applyEachSeries(collection, input, callback)
    //collection 是一个函数集合,每个函数都是 (input, callback),在函数中需要调用callback(作业完成)
    //input 是给每个函数的输入数据
    //callback 等所有的操作完成之后,会调用该函数,无任何参数 ()
    applyEachSeries: function () {
        async.applyEachSeries([showName, showAge,], {name: 'async2', age: '19'}, function () {
            console.log('逐个完成所有的异步操作');
        });
    },

    //compose会将每个操作一层层的包封组合起来,但是compose并不是同步执行
    //仍然是异步的,有可能外部包封的会先执行,这样可能会跟预想的不一样
    //参数说明: compose(fn1, fn2,...)
    //fn1 (result,callback),输入数据流,以及回调函数callback(error, result)
    compose: function () {
        function add1(n, callback) {
            setTimeout(function () {
                callback(null, n + 1);
            }, 3000);
        };

        function mul3(n, callback) {
            setTimeout(function () {
                callback(null, n * 3);
            }, 2000)
        }

        var add1mul3 = async.compose(add1, mul3);
        add1mul3(20, function (err, result) {
            console.log('计算完成,结果=' + result);
        });

        //分别执行
        //async.applyEachSeries([add1, mul3], 20, function(err, result){
        //    console.log('applyEach计算完成,结果=' + result);
        //});

        //这个mul3,必须会在add1之后执行
        async.auto({
            add1: add1.bind(null,30),
            mul3: ['add1', function (results, callback) {
                var last = results.add1;
                mul3(last, callback);
            }],
        }, function (err, result) {
            console.log(err);
            console.log('auto计算的结果:' + result.mul3);
        })

    },

    //相当于java或c++的while语句
    //参数说明:during有三个参数 during(test, fn, callback)
    //test (callback),调用callback(err, test_statement)
    //fn (callback),调用callback(),跳转到条件函数中进行检测
    //callback (err),如果err不是null,说明执行过程出错,否则说明跳出循环,执行完成
    during: function () {
        var count = 0;
        async.during(function (callback) {
                console.log('验证是否满足during的跳出条件...');
                callback(null, count < 5);
            },
            function (callback) {
                setTimeout(function () {
                    count++;
                    callback();
                }, 1000);
            },
            function (err) {
                console.log('已经异步过去了5秒钟');
            });
    },
}

var aft = new AsyncControlFlowTest();
var filter_member = ['auto']
for (var m in  aft) {
    if (typeof(aft[m]) == 'function' && filter_member.indexOf(m) == -1) {
        console.log('开始测试:' + m);
        aft[m]();
    }
}

【Pandas】pandas Series apply `pandas.Series.apply` 是 Pandas 库中 `Series` 对象的一个方法,用于将一个函数应用到 `Series` 的每个元素或整个 `Series`。它提供了极大的灵活性,可以应用于各种数据处理和转换任务。 阅读详情

相关推荐

nodejs 同步循环(使用async的eachSeries和waterfall,解决异步循环问题)

记录nodejs实际使用问题。 需求描述: 使用nodejs开发后台,对同一个表的同一个字段会有多次循环连续的查询和修改操作。 //data 是个数组集合 data.foreach(function (item) { //1.查询a表的content字段 //2.修改a表的content字段 }) 开发中出现的问题:最开始只是使用了waterfall来控制查询和更新操作保...

痞子的博客 4322

async异步流程控制模块源码

 Collections 集合处理 async.forEachOf  |  eachOf(object, iterator, callback) 实现功能:遍历object对象执行iterator,报错或遍历执行完成时调用callback(error);callback(error)函数的触发时机需要手动在iterator中设置。 源码解读:_keyIterator函数借用闭包遍历对...

schifred的博客 1072

pandas进阶--Series的apply方法

本文介绍了Series的apply方法,包括apply方法的具体介绍、以及传递不同函数时的使用用例。

qq_38727995的博客 4930

【Pandas】.apply() 方法:对 Series 或 DataFrame 的行/列应用自定义函数

Pandas 的 .apply() 方法用于 对 Series 或 DataFrame 的行/列应用自定义函数,适用于 数据清洗、特征工程、数据转换 等任务。axis=0 按列操作,axis=1 按行操作。相比 map() 和 applymap(),apply() 更通用,适用于更复杂的计算。

彬彬侠的博客 1720

pandas apply() 函数

apply函数对于Series,可以对每个元素执行操作,但是对DataFrame的话,则是对每列执行函数,如果想要每个元素操作的话,应该使用applymap。 Series.apply() 回到主题, pandas 的 apply() 函数可以作用于 Series 或者整个 DataFrame,功能也是自动遍历整个 Series 或者 DataFrame, 对每一个元素运行指定的函数。 举一个例子,现在有这样一组数据,学生的考试成绩: Name Nationality Score 1 张

u014370944的博客 659

Python_pandas不是熊猫(3)——Series自定义运算Series.apply()

0.写在前面 之前大意疏忽了,补上pandas的版本: >>> import pandas as pd;pd.__version__ '1.0.3' 准备我们要用的数据: import pandas as pd import numpy as np rst = np.random.RandomState(seed=2333) # 加入seed,使得生成的数据相同 exampl...

先说一下,就简单地写点儿氵文,不是博客,只是我的笔记本/工具书 1031

node.js async

async 是基于node.js 一个流程控制包,我们常用的主要是为了适应异步编程,减少回调的嵌套,控制函数同步或者控制函数异步后执行后续操作的功能。

远古大猛犸 4320

pandas—apply

“应用”(apply),数据清理

qq_45286306的博客 601

async中series、parallel、waterfall、eachSeries等方法的使用

简介 Async是一个流程控制工具包,提供了直接而强大的异步功能。基于Javascript为Node.js设计,同时也可以直接在浏览器中使用。 Async提供了大约20个函数,包括常用的 map, reduce, filter, forEach 等,异步流程控制模式包括,串行(series),并行(parallel),瀑布(waterfall)等。 文档地址:https://caolan.g...

sunqy1995的博客 1万+

async异步问题(waterfall、parallel、eachSeries、map、whilst)

async中最常用的几种方法解析,有代码.有真相.

momDIY的博客 1万+

AsyncJS 异步流程控制DEMO详细介绍

1. 基本流程 串行流程、并行流程、混合执行 series, waterfall; parallel, parallelLimit; auto; 1.1. 串行流程 1.1.1. series(多个函数依次执行,之间没有数据交换) 有多个异步函数需要依次调用,一个完成之后才能执行下一个。各函数之间没有数据的交换,仅仅需要保证其执行顺序。这时可使用series。 async.series([ ...

weixin_34226706的博客 337

pandas.Series.apply 函数的参数信息和使用方法

方法允许你对Series中的每个元素应用一个函数。这个函数可以是一个Python函数,也可以是一个NumPy的ufunc(适用于整个Series的函数)。 输出: 示例2:使用匿名函数作为参数传递给 输出与示例1相同。 输出: 示例4:定义一个接受关键字参数的自定义函数,并将这些参数传递给 输出: 示例5:使用NumPy库中的函数 输出:

m0_63790372的博客 665

pandas中Series的apply函数

闲来无事 浏览源码 发现了一个特别有意思的函数 Series中的apply()函数 和大多数apply函数一样,这个函数传入的参数也是一个函数,目的是对传入的series的值进行批量的处理,不用我们手动写函数来处理 举个例子: 我有一个series,大概样子是这样的 我想要做的就是只要这些日期中的年,我们都知道直接split,之后取第一个就好, 达到的结果是这样 如果按照常规的方法 def...

qq_42896149的博客 6402

流程控制async

看看npmjs.org里的模块依赖排行榜,async常期排在前三,可见此库确实不错,今天就来简单的说说它的作用 asyncnodejs里的流程控制模块,也可以用在浏览器端,主要是用来控制多个异步调用时的顺序以及依赖,在不用async之前,多个异步调用通常是这样的 fs.readFile('file1', function(){ fs.rea...

weixin_34354173的博客 301

Nodejs异步流程控制Async

从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发。Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎。chrome浏览器就基于V8,同时打开20-30个网页都很流畅。Nodejs标准的web开发框架Express,可以帮助我们迅速建立web站点,比起PHP的...

fens的博客 470

nodejs常用模块async(waterfall,each,eachSeries,whilst)

a

闻道百 3万+

Async详解之一:流程控制

转载:http://freewind.me/blog/20120515/917.html 为了适应异步编程,减少回调的嵌套,我尝试了很多库。最终觉得还是async最靠谱。 地址:https://github.com/caolan/async Async的内容分为三部分: 流程控制:简化十种常见流程的处理集合处理:如何使用异步操作处理集合中的数据工具类:几个常用的工具类 本文介绍其

rayi_hong的专栏 998

【Python学习笔记】44:Series.apply()列数据批量处理,Series.str.extract()正则匹配

学习《Python3爬虫、数据清洗与可视化实战》时自己的一些实践。 Series.apply()列数据批量处理 先将该列取出,形成Series对象,再调用apply()方法传入用于处理的函数,这个过程就像map()一样。 import pandas as pd # 各国人口数据文件 df_pop = pd.read_csv("E:/Data/practice/european_cities.c...

大桔骑士的学习笔记 4054

Node js 异步执行流程控制模块Async compose

通过compose组合,f(g(h()))的形式,从内层到外层的执行的顺序。

JBBOY的专栏 3112
上一篇: nodejs.async中流程控制auto,autoInject,cargo的用法
下一篇: async太好用了,用了两个小时写的代码
davidsu33
博客等级 码龄18年 112粉丝 347原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值