• nodejs异步---Async


    一:异步基础

    1.由于node.js天生就是异步,所以效率很高,性能强。

    console.log('hi!');
    setTimeout(function(){
       console.log('hello!');
    },1000);
    console.log('wow!');

    比如这个,输出结果:hi

                                        wow!

                                      hello!

    可以看出nodejs的异步性

    2.高阶函数

    高阶函数给我的感觉就是闭包。

    function test(a){
        return function(b){
            return a+b;
        }
    }
    var q=test(2)(3);
    console.log(q);

    返回值是一个函数,函数作为参数传递。

    3.偏函数----------个人理解就是闭包

    假设有一个参数或变量已经预置的函数A,我们通过调用A来产生一个新的函数B,函数B就是我们说的偏函数

    function test(a){
        return function(b){
            console.log(a+" say "+b);
        }
    }
    var q=test("tom")("hello");

    偏函数:一个创建函数的工厂函数;通过指定部分参数,定制新的函数。

    但是两个都是闭包的一种。

    二.Async异步

    首先安装async-----这个就不多说

    npm install async

    1.series(tasks,callback)

    var async=require("async");
    async.series({
        one: function(callback){
            callback(null,1)  ;
        },
        two: function(callback){
            callback(null,2) ;
        }
    },function(err, results) {
        console.log(results)
    });
    

    这样会按照写入顺序依次执行各个函数,结果是一个集合{ one: 1, two: 2 }

    注意:series函数的第一个参数可以是一个数组也可以是一个JSON对象,参数类型不同,影响的是返回数据的格式

    2,waterfall(tasks,callback)

    var async=require("async");
    async.waterfall([
        function(callback){
            //task1
            callback(null,1);
        },function(data,callback){
            console.log(data);
            callback(null,2);
        }
    ],function(err,results){
        console.log(results);
    });
    

     和series()函数一样,会依次执行各个函数,但是每一个函数执行成功后产生的值传给下一个函数,而不是results

    注意:waterfall的tasks参数只能是数组类型。

    3.parallel函数(tasks,callback)

    var async=require("async");
    async.parallel([
            function(callback){
                callback(null, 'one');
            },
            function(callback){
                callback(null, 'two');
            }
        ],
        function(err, results){
                console.log(results);
        });
    

      parallel函数是并行执行多个函数,每个函数都是立即执行,不需要等待其它函数先执行。 传给最终callback的数组中的数据按照tasks中声明的顺序,而不是执行完成的顺序

    注意:tasks参数可以是一个数组或是json对象,和series函数一样,tasks参数类型不同,返回的results格式会不一样。

    4.parallelLimit(tasks,limit,callback)

    var async=require("async");
    async.parallelLimit([
            function(callback){
                setTimeout(function(){
                    callback(null, 'one');
                }, 3000);
            },
            function(callback){
                setTimeout(function(){
                    callback(null, 'two');
                }, 1000);
            }
        ],
        2,//设置同时执行的函数个数
        function(err, results){
            console.log(results);
        });

    如果limit是1的话,那么4S执行完毕,如果limit是2,那么3S解决完毕。

    5.whilst(test,fn,callback)

    test参数是一个返回布尔值结果的函数,通过返回值来决定循环是否继续,作用等同于while循环停止的条件.

    var async = require('async');
    var j = 0;
    async.whilst(
        function(){
            return j<3;
        },
        function(callback){//记得此处应该有回调函数
            j++;
            console.log('whileCb'+j);
            callback();
        },
        function(err){
        }
    )
    

     callback()就是达到了条件就会循环。

    6.iterator(tasks)

    var iter = async.iterator([
        function(){console.log('111');},
        function(){console.log('222');},
        function(){console.log('333');}
    ]);
    
    var it1 = iter();
    it1();
    

    说一下async里的回调函数,并非由使用者指定。

    比如series()可改写为

    fs.readFile("1.txt",'utf-8',function(err,content){
        if(err){
            return callback(err);
        }
        fs.readFile("2.txt",'utf-8',function (err,data) {
            if(err){
                return callback(err);
            }
            callback(null,[content,data]);
        })
    }
    

      

    本博客相当于课程笔记吧!

    /*async课程:http://www//com/course/543e1a4f032c7816c0d5dfa1

    //内容是.hubwiz.
    */

      

  • 相关阅读:
    解决 Windows 下的 :所选择的任务“{0}”不再存在。若要查看当前任务,请单击“刷新”。
    学习编译更好的 DAO 的技巧
    宇宙的起源演讲全文(斯蒂芬·霍金)
    java對象序列化的兩種使用方法
    Ubuntu硬盘安装与配置(3D效果)
    java異常處理
    [zt]JDBC对数据库的事务操作
    [zt]spring本地事务与JTA事务实现解析
    Debian溫習
    在oracle中增大session數量
  • 原文地址:https://www.cnblogs.com/lilight/p/7512244.html
Copyright © 2020-2023  润新知