• node.js async流程控制器--queue(队列)


    queue流程控制器是一个并行的流程控制器,但是它与parallel的区别在于queue可以控制一次执行几个函数,而parallel只是让所有函数并行执行.

    例子如下:

    var q = async.queue(function (obj,cb) {
    
    setTimeout(function () {
    
      console.log(obj);
      cb();
    },obj.time)
    },1)
    
    for (var i = 0; i<100; i++) {
      
    console.log(1);
      
      q.push({name:i,time:i*1000},function (err) {
          console.log(err);
      }) };
    for (var i = 0; i<100; i++) {   console.log(2);   q.push({name:1,time:1000},function (err) {
        console.log(err);
      }) };

    这里用了一个伪异步执行的方式,queue的参数有两个,第一个是一个函数,第二个是执行的进程数,第一个参数又包含两个参数,第一个是传递的对象,第二个是回调函数,例子中只有在console.log(obj)执行完后调用cb();队列才会往下执行,queue会返回一个标识符(例子中的q).

    例子中的q.push是往队列中添加数据(会被queue里的obj接收),第二个参数是一个回调函数,如果有异常会触发此回调函数。例子中每次只插入一个数据,也可以插入多个例如q.push([{name:0,time:1000}],{name:1,time:2000}]);(这里是个数组).

    这里为了确认循环是否真的执行,所以在循环中打印了两个数字.执行的结果是先循环打印了console.log(1)然后再循环打印了console.log(2),这里说明  确实两个循环执行到了,然后会先把第一个循环加入到queue里的对象打出来,然后把第二个循环打印出来,充分遵守了队列的性质:先进先出,后进后出的规则,不会因为因为执行的时间而使得结果混乱.如果把queue里的工作数改为2,则会每次打印两个.

    queue还有几个函数,比如:

    worker数量将用完时,会调用saturated函数:

    q.saturated = function() { 
        log(‘all workers to be used’); 
    }

    当最后一个任务交给worker执行时,会调用empty函数

    q.empty = function() { 
        log(‘no more tasks wating’); 
    }

    当所有任务都执行完时,会调用drain函数

    q.drain = function() { 
        console.log(‘all tasks have been processed’); 
    }
  • 相关阅读:
    分享15个Linux 实用技巧,提高工作效率
    隐藏搜索框:CSS 动画正反向序列
    js检测开发者工具是否打开,防止别人恶意调试我们的代码
    Js实现元素右滑回弹效果(基于Uniapp)
    css ::marker伪元素,修改li的项目符号颜色,字号字体
    Jump Game II
    Google 面经 09/26
    Word Search
    Remove Duplicates from Sorted List
    Remove Duplicates from Sorted List II
  • 原文地址:https://www.cnblogs.com/tudou1223/p/4151851.html
Copyright © 2020-2023  润新知