<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Promise</title>
</head>
<body>
<script type="text/javascript">
/**
* new Promise 接收一个function作为参数,
* function中有两个回调函数作为参数,
* 一个成功的回调函数,一个是失败的回调函数
* **/
var p3 = new Promise(function(resolve, reject) {
setTimeout(() => {
resolve('3秒钟结束了')
}, 3000)
})
var p5 = new Promise(function(resolve, reject) {
setTimeout(() => {
resolve('5秒钟结束了')
}, 5000)
})
var p2 = new Promise(function(resolve, reject) {
setTimeout(() => {
resolve('2秒钟结束了')
}, 2000)
})
p3.then(r => console.log(r))
p5.then(r => console.log(r))
p2.then(r => console.log(r))
//Promise的链式调用 then中的回调函数可以接收上一次then的返回值
p2.then(r => {
console.log(r)
return 'aaa'
}).then(c => console.log(c))
//Promise.all 它是以数组作为对象
// 当数组中的所有Promise都执行完毕之后才执行then
// 返回的数据是每个Promise对象数据组成的数组,结果是按照参数顺序执行的
// Promise.all([p2,p3,p5]).then(res=>console.log(res))
function promiseAll(arr) {
let newArr = []
//for(let i=0;i<arr.length;i++){
// newArr.push(null)
//}
return new Promise((resolve,reject)=>{
arr.forEach((item,index) => {
newArr.push(null)
item.then(r => {
newArr[index] = r
let flag = newArr.every(v=>v!=null)
if(flag){
resolve(newArr)
}
})
})
})
}
promiseAll([p2, p5, p3]).then(r=>console.log(r))
</script>
</body>
</html>
上次有朋友反馈封装的Promise.all有问题,执行顺序有问题,现在改进一下
最新推荐文章于 2023-11-02 14:33:12 发布