前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JS如何控制任务的执行顺序

JS如何控制任务的执行顺序

原创
作者头像
小鑫
发布2022-05-11 16:35:24
3.5K0
发布2022-05-11 16:35:24
举报
文章被收录于专栏:小鑫の随笔小鑫の随笔

唠唠嗑

放假在家当咸鱼有一段时间了,也好久没写笔记了,今天逛技术社区的时候遇到了一个有点意思的题目,正好也是我没遇到过的场景,于是记录一下

整活

需求是这样的:

实现一个 EatMan 说明:实现一个 EatMan,EatMan 可以有以下一些行为 示例: 1.EatMan(“Hank”) 输出 Hi This is Hank! 2.EatMan(“Hank”).eat(“dinner”).eat(“ supper”) 输出 Hi This is Hank! Eat dinner~ Eat supper~ 3.EatMan(“Hank”).eat(dinner’).eatFirst(“lunch”) 输出 Eat lunch Hi This is Hank! Eat supper~ 4.EatMan(“Hank”).eat(‘dinner).eatFirst(“lunch”).eatFirst(“breakfast”) 输出 Eat breakfast~ Eat lunch~ Hi This is Hank! Eat supper~

从这里不难看出,这里主要的点是链式调用和流程控制

链式调用很简单,核心的点就是函数执行完后 返回 this,栗子:

class EatMan {
  eat(food) {
    console.log(`eat ${food} ~`);
    return this;
  }
}

new EatMan().eat('apple').eat('pear')

这样就实现链式调用了,下面上主菜 - 控制任务的执行顺序

这里参考某些中间件的实现思路,首先创建一个任务队列,把每个函数放进去,按顺序执行,每个函数执行完成后调用一个 next 函数,执行下一个函数

class EatMan {
  constructor(name) {
    this.name = name;
    this.tasks = [];
    this.init();
	
    // 利用 setTimeout 的机制 在下一个事件循环才开始执行
    setTimeout(() => {
      this.next();
    }, 0);
  }

  init() {
    const _this = this
    const fn = function() {
      console.log('Hi This is Hank!');
      _this.next()
    }
    this.tasks.push(fn)
  }

  next() {
    const t = this.tasks.shift();
    t && t();
  }

  eat(name) {
    const _this = this;
    const fn = function () {
      console.log(`Eat ${name}~`);
      _this.next();
    };
    this.tasks.push(fn);
    return this;  // 实现链式调用
  }

  eatFirst(name) {
    const _this = this;
    const fn = function () {
      console.log(`Eat ${name}~`);
      _this.next();
    };
    this.tasks.unshift(fn);
    return this;
  }
}

new EatMan("Hank").eat("dinner").eat("supper").eatFirst("lunch").eatFirst("breakfirst");

输出:

Eat breakfirst~ Eat lunch~ Hi This is Hank! Eat dinner~ Eat supper~

首发自:JS如何控制任务的执行顺序 - 小鑫の随笔

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 唠唠嗑
  • 整活
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档