面试题收集

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);
    }
}

 

posted @ 2020-05-09 10:22  全玉  阅读(189)  评论(0编辑  收藏  举报