异步流程控制 遍历篇do-while

本文介绍了异步遍历的两种方法,doDuring会在test函数返回true时停止循环,而doUntil则是根据test函数返回值来决定是否终止。文中提供了这两个方法的基本使用示例以及实现代码,帮助理解它们的工作原理。
摘要由CSDN通过智能技术生成

异步遍历

doDuring

  • 直到第二个参数test函数返回true时,停止循环,触发callback

基本使用

nac.doDuring(
   function (callback) {
     setTimeout(function () {
       console.log('end');
       index++;
       callback(null); // 作用是触发和传递参数给test
     }, 1000);
   },
   function (callback) {// test函数,返回true时停止任务,触发下一个callback
     callback(null, index!==3);
   },
   function (err) {
     if (err) {
       console.error(err);
     } else {
       console.log('done');
     }
   }
 );

实现:

function doDuring(iterator, test, callback) {
  callback = callback || noop;
  iterate(null, true);

  // iterate->iterator->iterate

  function iterate(err, truth) {
    if (err) {
      return callback(err);
    }
    if (truth) {
      iterator(done);
    } else {
      callback(null);
    }
  }

  function done(err, res) {
    if (err) {
      return callback(err);
    }
    switch (arguments.length) {
      case 0:
      case 1:
        test(iterate);
        break;
      case 2:
        test(res, iterate);
        break;
      default:
        var args = slice(arguments, 1);
        args.push(iterate);
        test.apply(null, args);
        break;
    }
  }
}

doUntil

  • 和doDuring的区别是,通过test函数返回值来判断是否终止循环

基本使用

let count = 0;
nac.doUntil(
  (callback) => {
    count++;
    callback(null, count); // 触发test函数
  },
  (count) => {
    return count === 5;
  },
  (err, result) => {
    console.log(result);
  }
);

实现:

function doUntil(iterator, test, callback) {
  callback = callback || noop;
  var sync = false;
  next();

  function iterate() {
    if (sync) {
      nextTick(next); // 避免同步任务阻塞
    } else {
      sync = true;
      iterator(done);
    }
    sync = false;
  }

  function next() {
    iterator(done);
  }

  function done(err, arg) {
    if (err) {
      return callback(err);
    }
    if (arguments.length <= 2) {
      if (!test(arg)) {
        iterate();
      } else {
        callback(null, arg);
      }
      return;
    }
    arg = slice(arguments, 1);
    if (!test.apply(null, arg)) {
      iterate();
    } else {
      callback.apply(null, [null].concat(arg));
    }
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值