js异步成同步

  • js异步成同步有4种方法:Callback/Promise/Generator/async,下面我以题目为例子演示这四种方法。

题目

  • 现有打印红色、绿色和黄色三个函数,要求等待三秒后打印一次红色,然后等待2秒后打印一次绿色,接着等待一秒后再打印一次黄色;按此规律不断循环打印红绿黄。

// 亮灯函数如下:
function red(){ console.log(‘red’); }
function green(){ console.log(‘green’); }
function yellow(){ console.log(‘yellow’); }

解答

Callback(回调函数)
function Callback(){
    setTimeout(() => {
        red();
        setTimeout(() => {
            green()
            setTimeout(() =>{
                yellow()
                Callback();
            }, 1000)
        }, 2000);
    }, 3000);
}
Callback()
Promise
// Promise
function light(fun, time){
    return new Promise((res) => {
        setTimeout(() => {
            fun()
            res()
        }, time);
    })
}

function promise(){
    Promise.resolve().then(() => {
        return light(red, 3000) // 要返回Promise对象
    }).then(() => {
        return light(green, 2000)
    }).then(() => {
        return light(yellow, 1000)
    }).then(() =>{
        promise()
    })
}
promise()
Generator
// Generator
 function light(fun, time, gt){
    setTimeout(() => {
        fun()
        gt.next()
    }, time);
}

let gt = ""          // 让gt去控制函数的运行
function *generator(){
    yield light(red, 3000, gt)
    yield light(green, 2000, gt)
    yield light(yellow, 1000, gt)
    gt = generator()
    gt.next()
}

gt = generator()
gt.next()
async
function light(fun, time){
    return new Promise((res) => {
        setTimeout(() => {
            fun()
            res()
        }, time);
    })
}

async function asyncFun(){
    await light(red, 3000)  // async/await是一个组合
    await light(green, 2000)
    await light(yellow, 1000)
    asyncFun()
}
asyncFun()
  • 11
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值