面试连环问:
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()