题目描述
为什么下面两段代码,执行顺序会不同
相关代码
function light(color, second) {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log(color)
resolve()
}, second * 1000)
})
}
let list = [
{
color: 'red',
time: 3
},
{
color: 'green',
time: 2
},
{
color: 'yellew',
time: 1
}
]
function orderLights(list) {
let promise = Promise.resolve()
list.forEach(item => {
// promise.then(function() {
// return light(item.color, item.time)
// })
promise = promise.then(function () {
return light(item.color, item.time)
})
})
}
orderLights(list)
区别在于第一段代码,list中的数据都承接于Promise.resolve(),那么同步代码执行完成后,会按照red、green、yellew的顺序执行微任务,但是他们各自的微任务中又添加了3/2/1s的宏任务,那按照顺序就是等待时间短的宏任务先执行。
第二段代码,每一个promise都承接于list中上一个的promise,也就是上一个promise状态resolve后才会执行下一个,无论上一个promise需要等待多久