面试题|promise连环问,你真的理解promise吗?用promise实现一个红绿灯效果

面试连环问:

1.你对promsie了解多少?说说你对promsie的理解

promise是ES6中提供的一种异步编程的解决方案,可以用来解决回调地狱的问题,有效减少回调嵌套。从功能上来说,promise实际上就是一个容器,里面封装着异步操作 并可以获取异步操作的执行结果,调用同一的API进行处理。

从语法上来说,promsie是一个构造函数,接收一个函数作为参数,并返回一个有状态的promise实例。promise实例有三种状态:fulfilled(已成功)、rejected(已失败)、pending进行中,promise实例状态只能由pending变为fulfilled或rejected状态,且状态不受外界影响,只有异步操作的结果可以决定当前是哪种状态;一旦状态改变就不会再变,任何时候都可以得到这个结果。

2.promise状态是如何实现的

promise状态改变是通过在异步操作结束后调用resolve()和rejected()函数来实现的。,

promise原型上又定义了一个then方法,使用then方法可以为这两个状态的改变注册回调函数,执行相应的操作。

3.那你用promise实现一个红绿灯的效果吧

具体要求: 红灯三秒后变绿灯,绿灯5秒后变黄灯,黄灯2秒后变红灯(仅示例)

function red(){
    // 异步操作 顺序执行定义在promise里
    return new Promise((resolve)=>{
        console.log('当前是红灯,3秒后变绿灯')
        setTimeout(()=>{
            const greenPromise = green()
            resolve(greenPromise)
        },3000)

    })
}
function green(){
    // 异步操作 顺序执行定义在promise里
    return new Promise((resolve)=>{
        console.log('当前是绿灯,5秒后变黄灯')
        setTimeout(()=>{
            const yellowPromise= yellow()
            resolve(yellowPromise)
        },5000)
        
    })

}
function yellow(){
    // 异步操作 顺序执行定义在promise里
    return new Promise((resolve)=>{
        console.log('当前是黄灯,2秒后变红灯')
        setTimeout(()=>{
            const redPromise = red()
            resolve(redPromise)
        })
    })

}
red()

4.还有优化办法吗

可以使用async语法糖优化。

async函数内部自带执行器,当函数内部执行到一个 await 语句的时候,如果语句返回一个 promise 对象,那么函数将会等待 promise 对象的状态变为 resolve 后再继续向下执行。因此可以将异步逻辑,转化为同步的顺序来书写,并且这个函数可以自动执行。

实现:

async function timer(now,delay,next){
    return new Promise((resolve)=>{
        console.log(`当前是${now}灯,${delay}秒后变${next}灯`)
        setTimeout(()=>{
            resolve()
        },delay*1000)
    })
}
async  function light() {
    await timer('红','3','绿')
    await timer('绿','5','黄')
    await timer('黄','2','红')
    await light()
    
}
light()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当我们在进行一些需要异步处理的操作时,比如请求后端接口或者读取文件等,由于这些操作是需要时间的,可能需要几钟甚至几分钟,如果我们使用传统的回调函数处理方式,代码会得非常复杂和难以维护。这时候,Promise就是一种非常好的解决方案。 Promise是一种异步编程的解决方案,它是一个对象,可以代表某个未来才会完成的事件。Promise对象有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。 当我们执行一个异步操作时,可以返回一个Promise对象,然后在这个Promise对象上使用then方法来处理成功的回调,catch方法来处理失败的回调。这样我们就可以避免回调地狱,使代码更加清晰和易于维护。 比如下面的代码,我们使用Promise来处理异步操作: ``` function getData() { return new Promise((resolve, reject) => { // 异步操作,比如请求后端接口 setTimeout(() => { const data = { name: '张三', age: 18 }; resolve(data); }, 2000); }) } getData() .then(data => { console.log(data); // { name: '张三', age: 18 } }) .catch(error => { console.log(error); }) ``` 在上面的代码中,我们使用Promise包装了一个异步操作,然后在then方法中处理成功的回调,catch方法中处理失败的回调。当异步操作执行完成后,Promise对象会根据执行结果的成功或失败状态来执行相应的回调函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值