• 面试题收集


    1. 实现一个add方法

    add(1)(2,3)(4).value()  //输出: 10

    分析:对柯里化函数进行改造

    原curry函数

    function curry(f,...args1){
        const inner = (...args2) => {
            const args = [...args1,...args2];
            return args.length == f.length ? f(...args) : curry(f,args);
        }
        return inner;
    }

    改造后curry函数

    function curry(f,args1=[]){
        const inner = (...args2) => {
            return curry(f,args1.concat(args2));
        }
        //添加value方法
        inner.value = function(){
            return f(...args1);
        }
        return inner;
    }

    柯里化方法

    function originalAdd(...nums){
        return nums.reduce((pre,cur) => {
            return pre + cur;
        })
    }
    
    let add = curry(originalAdd);
    console.log('cur:', add(1)(2,3)(4).value());

    2.实现一个异步队列Queue,要求按时间依次执行callback

    new Queue().task(1000, function () {
        console.log(1);
    }).task(2000, function () {
        console.log(2);
    }).start()

    分析:task方法只收集参数,在start方法中,将参数转化为promise,并立即执行

    class Queue{
        tasks=[]
        task(time,fn){
            this.tasks.push([time,fn])
            return this;
        }
        start(){this.tasks.reduce((pre,cur) => {
                return pre.then((data) => toPromise(...cur,data)); 
            },Promise.resolve());
        }
    }
    
    function toPromise(time,fn,data){
        return new Promise((reslove) => {
            setTimeout(() => {
                reslove(fn());
            },time);
        })
    }

    start也可以使用await执行串行Promise,这样传递data不太方便

    async start(){
        for(let task of this.tasks){
            await toPromise(...task);
        }
    }
  • 相关阅读:
    树的可视化
    图的可视化
    1+1=2
    用xapian来做索引
    学习的快乐
    项目小结
    z=sin(xy)
    Min Stack
    互联网公司的文化
    为什么要读数学书
  • 原文地址:https://www.cnblogs.com/mengff/p/12855697.html
Copyright © 2020-2023  润新知