博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面试题 LazyMan 的Rxjs实现方式
阅读量:5772 次
发布时间:2019-06-18

本文共 1995 字,大约阅读时间需要 6 分钟。

前言

笔者昨天在做某公司的线上笔试题的时候遇到了最后一道关于如何实现LazyMan的试题,题目如下

实现一个LazyMan,可以按照以下方式调用:
LazyMan(“Hank”)输出:
Hi! This is Hank!

LazyMan(“Hank”).sleep(10).eat(“dinner”)输出

Hi! This is Hank!
//等待10秒..
Wake up after 10
Eat dinner~

LazyMan(“Hank”).eat(“dinner”).eat(“supper”)输出

Hi This is Hank!
Eat dinner~
Eat supper~

LazyMan(“Hank”).sleepFirst(5).eat(“supper”)输出

//等待5秒
Wake up after 5
Hi This is Hank!
Eat supper
以此类推。

鉴于时间的原因只可惜本人当时并没写出来,我当时脑海里其实看到提意就知道要用到队列、Promise等异步操作。然后我查阅了网上的资料好像关于这个LazyMan的实现方式倒不少,就说明这道题其实蛮有意思的,但大多都是关于Promise或setTimeout的实现,并没有Rxjs的实现方式,所以我就用一些操作符实现了这个LazyMan

class LazyManModel {    queue: { timeout: number, fn: Function }[] = []    constructor() {        setTimeout(() => {            from(this.queue).pipe(                map(e => {                    if (e.timeout) return of(e).pipe(delay(e.timeout * 1000));                    return of(e)                }),                concatAll()            ).subscribe(value => {                value.fn()            })        })    }    sleep(time: number): this {        this.queue.push({            timeout: time,            fn: () => { console.log(`Wake up after ${time}`) }        })        return this    }    eat(foot: string): this {        this.queue.push({            timeout: null,            fn: () => { console.log(`Eat ${foot}~`) }        })        return this    }    sleepFirst(time: number): this {        this.queue.unshift({            timeout: time,            fn: () => { console.log(`Wake up after ${time}`) }        })        return this    }    exported(): (name: string) => this {        return (name): this => {            this.queue.push({                timeout: null,                fn: () => { console.log(`Hi! This is ${name}!`) }            })            return this        }    }}

示例

const LazyMan = new LazyManModel().exported();LazyMan('Hank').eat('foot').eat('ping').sleep(10).eat('pizza').sleepFirst(5)

关于setTimeout

我在constructor构造函数里使用了setTimeout是因为,在调用的时候是链式的,其作用域一直都在同一堆栈,而setTimeout里则是把订阅的方法放到的最后一个栈执行

转载地址:http://wgaux.baihongyu.com/

你可能感兴趣的文章
exgcd、二元一次不定方程学习笔记
查看>>
经典sql
查看>>
CSS3边框会动的信封
查看>>
JavaWeb实例设计思路(订单管理系统)
查看>>
source insight中的快捷键总结
查看>>
PC-IIS因为端口问题报错的解决方法
查看>>
JavaScript学习笔记(12)——JavaScript自定义对象
查看>>
SQL中的Null深入研究分析
查看>>
多人交互与体感游戏开发相关技术说明
查看>>
cron表达式
查看>>
BDD数据集(mask_rcnn)1
查看>>
Linux下的Memcache安装
查看>>
调用约定
查看>>
【转】ROS之topic和service通信比较
查看>>
[转]Linux 线程实现机制分析 Linux 线程实现机制分析 Linux 线程模型的比较:LinuxThreads 和 NPTL...
查看>>
lesson7:java线程池
查看>>
【2019年OCP新题】OCP题库更新出现大量新题-11
查看>>
N-Queens
查看>>
mysql允许远程连接
查看>>
PHP工厂模式的好处
查看>>