实现一个函数方法,要求实现以下功能
arrange("William").execute();
>打印 William
arrange('William").do('commit").execute();
> 先打印 William
> 再打印 commit
arrange('William').wait(5).do('commit').execute();
> 打印William
> 等待5秒
> 再打印 commit
arrange("William").waitFirst(5).do("push").execute();
>等待 5秒
> 打印William
> 打印 push
function arrange(str) {
//首先搞一个数组用来存储任务队列
let arr = [];
//初始化arrange就要执行一个任务,所以初始化添加一个任务
arr.push(() => {
console.log(str);
});
// do是添加一个任务且在初始化后执行,就push一个
function dos(s) {
arr.push(() => {
console.log(s);
});
return this;
}
// 这里利用propise来实现添加一个等待多久执行的代码
function wait(time) {
arr.push(() => {
return new Promise((res) => {
setTimeout(res, time * 1000);
});
});
return this;
}
// 同样的利用propise来实现添加一个等待多久执行的代码
// 是需要初始化前就等待,所以在添加在整个任务队列开头
function waitFirst(time) {
arr.unshift(() => {
return new Promise((res) => {
setTimeout(res, time * 1000);
});
});
return this;
}
// 这是以一个执行所有任务的方法,所以遍历任务队列依次执行他
// 又因为丢列中有Promise需要等待的代码,所以声明async函数来达到顺序执行的目的
async function execute() {
for (ele of arr) {
await ele();
}
}
//因为arrange可以链式调用,所以这个函数返回的一定是一个对象,
//并且waitFirst\do\wait也可以链式调用arrange的方法,所以这三个方法返回的是this
return {
execute,
do: dos,
wait,
waitFirst,
};
}
arrange("初始化执行").do("一个do").waitFirst(3).do("第二个do").execute();