promise 实战应用
限制异步操作的并发个数,并尽快完成
promise 解决实际问题
- 将异步操作任务队列,转换成确定的顺序执行
js
// 两种方式的区别?
// 这里的 p.then 里面是异步微任务,又将将状态的转变放入了宏任务当中
const arr = [1, 2, 3]
arr.reduce(
(p, x) =>
p.then(() => new Promise((r) => setTimeout(() => r(console.log(x)), 1000))),
Promise.resolve()
)
// p.then() 里面的参数如果不是函数的话,会发生透传,那.then() 里的代码是会执行的
// 所以这里的 p.then 相当于执行了一段同步代码,将状态的转变放入了宏任务当中
const result = arr.reduce(
(p, x) =>
p.then(new Promise((r) => setTimeout(() => r(console.log(x)), 1000))),
Promise.resolve()
)
实现红绿灯循环亮功能
js
function red() {
console.log('red')
}
function green() {
console.log('green')
}
function yellow() {
console.log('yellow')
}
const light = function (timer, cb) {
return new Promise((resolve) => {
setTimeout(() => {
cb()
resolve()
}, timer)
})
}
const step = function () {
Promise.resolve()
.then(() => {
return light(3000, red)
})
.then(() => {
return light(2000, green)
})
.then(() => {
return light(1000, yellow)
})
.then(() => {
return step()
})
}
step()