分别用promise、generator、async方法,解决代码中出现的回调地狱问题

回调地狱:

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)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值