解决方法:问题是按顺序执行,那么就抓住核心一定在一个宏任务执行完再执行下一个宏任务。总结就是利用cb回调方法,因为是先打印,让cb里面去执行func2函数,那么就一定先打印出func1,以此类推
function fun1(cb) {
setTimeout(() => {
console.log('fun1');
cb()
}, 3000)
}
function fun2(cb) {
setTimeout(() => {
console.log('fun2');
cb()
}, 1000)
}
function fun3(cb) {
setTimeout(() => {
console.log('fun3');
cb()
}, 2000)
}
function euque(list) {
const compose = list.reduceRight((pre, curr) => {
return () => curr(pre)
}, () => {})
compose()
}
euque([fun1, fun2, fun3])
reduceRight其实跟reduce是一样的,只不过是从数组末尾开始遍历
整理过后的compose其实是一个函数,分解下来就是
function compose() {
return fun1(() => {
return fun2(() => {
fun3(() => {})
})
})
}
compose()
为啥执行compose()就会打印三个呢。因为compose函数return的时候fun1()里面传了参数相当于调用了函数。而reduce的时候直接把代码return到函数中去,并不会相应的执行