回调地狱:
setTimeout(()=>{
console.log(1111)
setTimeout(()=>{
console.log(2222)
setTimeout(()=>{
console.log(3333)
},3000)
},2000)
},1000)
1、用Promise
function pro(data, time) {
return new Promise(res => {
setTimeout(() => {
res(data)
}, time * 1000)
})
}
pro(111, 1).then(res => {
console.log(res)
return pro(222, 2)
}).then(res => {
console.log(res)
return pro(333, 3)
}).then(res => {
console.log(res)
})
2、用async
async function run() {
console.log(await pro(111, 1))
console.log(await pro(222, 2))
console.log(await pro(333, 3))
}
run()
3、generator
这个是真的难想,这个属于JS的套路问题,纯generator来做,思路:
- 利用柯里化,存储每次要执行的函数
- 在每次执行的函数中加入next,来通知下一次执行
- 本质上这里的generate是强行在用,放到数组里一样能行
- 重要的是柯里化来保存将要执行的函数和注入回调的思路
function handleData(data, time, cb) {
setTimeout(() => {
console.log(data)
cb()
}, time * 1000)
}
function handleGen(gen) {
const g = gen()
const next = () => {
let result = g.next()
if(result.done) return
result.value(next)
}
next()
}
var thunk = fn => (...args) => cb => {
args.push(cb)
fn(...args)
}
var f = thunk(handleData)
function* gen() {
yield f(111, 1)
yield f(222, 2)
yield f(333, 3)
}
handleGen(gen)