Skip to content

📚 16.hardman

💻 代码实现

typescript
/**
 * @description 腾讯爱考题目-来自牛客
 * @url https://juejin.cn/post/7406150677225898023
 */

// ps: 关键设计思路(针对于restFirst函数)
// 1.任务队列机制
// 2.同步任务和异步任务的方式。异步执行控制

// 写一个hardMan函数,满足控制台打印效果如下:
// ===============================================
// hardMan('潘潘')
//> Hi! I am 潘潘.
// =============================================== 
// hardMan('潘潘').study('Project')
//> Hi! I am 潘潘.
//> I am studying 敲码.
// ===============================================
// hardMan('潘潘').rest(3).study('敲码')
//> Hi! I am 潘潘.
// 此时等待三秒钟
//> Wait 3 seconds.
//> I am studying 敲码.
// ===============================================
// hardMan('潘潘').restFirst(3).study('敲码')
// 此时等待三秒钟
//> Wait 3 seconds.
//> Hi! I am 潘潘.
//> I am studying 敲码.
// ===============================================

async function sleep(seconds) {
    await new Promise(resolve => {
        setTimeout(() => {
            console.log(`Wait ${seconds} seconds.`);
            resolve()
        }, seconds * 1000);
    })
}


// 函数式类的写法
function hardManClass(name) {
    this.task = []

    setTimeout(async () => {
        for (let tak of this.task) {
            await tak()
        }
    }, 0);


    this.task.push(() => {
        return new Promise(resolve => {
            console.log(`Hi! I am ${name}.`);
            resolve()
        })
    })

    this.study = function (studyName) {
        this.task.push(() => {
            return new Promise(resolve => {
                console.log(`I am studying ${studyName}.`);
                resolve()
            })
        })
        return this;
    }

    this.rest = function (time) {
        this.task.push(async () => {
            await sleep(time)
        })
        return this
    }

    this.restFirst = function (time) {
        this.task.unshift(async () => {
            await sleep(time)
        })
        return this
    }

    return this
}

function hardMan(name) {
    return new hardManClass(name)
}


// hardMan('潘潘')
// hardMan('潘潘').study('Project')
hardMan('潘潘').rest(3).study('敲码')
// hardMan('潘潘').restFirst(3).study('敲码')

Released under the MIT License.