理解和使用Promise.all和Promise.race
一、promise.all的使用
- 说明 Promise.all 可以将多个Promise实例包装成一个新的Promise实例,等待所有都完成(或第一个失败)
- 返回值 成功的时候返回的是一个数组,失败的时候则返回先被reject失败状态的值
let p1 = new Promise((resolve, reject) => {resolve('成功了')
})let p2 = new Promise((resolve, reject) => {resolve('success')
})let p3 = Promse.reject('失败')Promise.all([p1, p2]).then((result) => {console.log(result) //['成功了', 'success']
}).catch((error) => {console.log(error)
})Promise.all([p1,p3,p2]).then((result) => {console.log(result)
}).catch((error) => {console.log(error) // 失败的消息
})
代码模拟
let test = (time) => {return new Promise((resolve, reject) => {setTimeout(() => {resolve(`${time / 1000}秒后测试`)}, time)})
}let p1 = test(3000)
let p2 = test(2000)Promise.all([p1, p2]).then((result) => {console.log(result) // [ '3秒后测试', '2秒后测试' ]
}).catch((error) => {console.log(error)
})
注意:
Promise.all 获得的成功结果的数组里面的数据顺序和Promise.all接收到的顺组的顺序是一致的,即 p1的结果在前,即便p1的结果获取的比p2晚。当遇到发送多个请求并根据请求顺序获取和使用数据的场景,Promise.all 毫无疑问解决这个问题。
二 .Promise.race的使用
Promise.race([p1,p2,p3])里面哪个结果获得的快,就返回哪个结果,不管结果本身是成功状态还是失败状态
let p1 = new Promise((resolve, reject) => {resolve('success')
})let p2 = new Promise((resolve, reject) => {reject('failed')
})Promise.race([p1, p2]).then((result) => {console.log(result)
}).catch((error) => {console.log(error) // 打开的是 'failed'
})