前端面试之--实现arrange工作调度

实现一个函数方法,要求实现以下功能

arrange("William").execute();

      >打印 William

arrange('William").do('commit").execute();

      > 先打印 William

      > 再打印 commit

 arrange('William').wait(5).do('commit').execute();

      > 打印William

      > 等待5秒

      > 再打印 commit

 arrange("William").waitFirst(5).do("push").execute();

      >等待 5秒

      > 打印William

      > 打印 push

function arrange(str) {
        //首先搞一个数组用来存储任务队列
        let arr = [];
        //初始化arrange就要执行一个任务,所以初始化添加一个任务
        arr.push(() => {
          console.log(str);
        });      
        // do是添加一个任务且在初始化后执行,就push一个
        function dos(s) {
          arr.push(() => {
            console.log(s);
          });
          return this;
        }
        // 这里利用propise来实现添加一个等待多久执行的代码
        function wait(time) {
          arr.push(() => {
            return new Promise((res) => {
              setTimeout(res, time * 1000);
            });
          });
          return this;
        }
        // 同样的利用propise来实现添加一个等待多久执行的代码
        // 是需要初始化前就等待,所以在添加在整个任务队列开头
        function waitFirst(time) {
          arr.unshift(() => {
            return new Promise((res) => {
              setTimeout(res, time * 1000);
            });
          });
          return this;
        }
         // 这是以一个执行所有任务的方法,所以遍历任务队列依次执行他
        // 又因为丢列中有Promise需要等待的代码,所以声明async函数来达到顺序执行的目的
        async function execute() {
          for (ele of arr) {
            await ele();
          }
        }
        //因为arrange可以链式调用,所以这个函数返回的一定是一个对象,
        //并且waitFirst\do\wait也可以链式调用arrange的方法,所以这三个方法返回的是this
        return { 
          execute,
          do: dos,
          wait,
          waitFirst,
        };
      }
      arrange("初始化执行").do("一个do").waitFirst(3).do("第二个do").execute();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值