1.要求不能使用async/await ,请使用Promise的方式实现
const timeout = (ms) => new Promise((resolve) => {
setTimeout(() => {
resolve()
}, ms)
})
const ajax1 = () => timeout(2000).then(() => {
console.log('1')
return 1
})
const ajax2 = () => timeout(1000).then(() => {
console.log('2')
return 2
})
const ajax3 = () => timeout(2000).then(() => {
console.log('3')
return 3
})
const executePromise = (ajaxArray) => {
// 不能使用async/await ,请使用Promise的方式实现
}
executePromise([ajax1, ajax2, ajax3]).then(data => {
console.log('done')
console.log(data)
})
// 要求分别输出
// 1
// 2
// 3
// done
// [1,2,3]
有一个概念是只有返回promsie对象后才会链式调用。就是说我们可以在 executePromise 函数中返回一个Promise 让传入的 [ajax1,ajax2,ajax3], 顺序执行完后使用reslove() ;方法结束当前Promise状态,最后调用函数的then方法就会执行啦。
好,现在我们只需要考虑 executePromise 函数 中传入的Promise 顺序执行异步任务就行了
且由于每次调用then都会创建一个新的promise实例,所以只有当执行完 return "Promsie"后,then返回一个值为Promise的promise对象,才会继续链式调用then。
利用Promise.resolve()+forEach循环/reduce循环,将promise串成一任务队列,本质上是简化的链式调用。
const executePromise = (ajaxArray) => {
// 不能使用async/await ,请使用Promise的方式实现
return new Promise((resolve) => {
let promise = Promise.resolve()
let result = []
for (let i = 0; i < ajaxArray.length; i++) {
promise = promise.then(ajaxArray[i]).then(res=> {
result.push(res)
})
}
promise.then(()=> {
resolve(result)
})
})
}
end: 完结🥳