JavaScript执行异步调用的传统方式是事件和回调函数,随着应用的复杂化,事件和回调函数无法完全满足开发者要实现的要求,为此ES6给出了Promise这已强大的异步编程解决方案。
- 基本用法
Promise可以通过Promise构造函数创建,这个构造函数只接受一个参数,包含初始化Promise代码的执行器(executor)函数,在该函数内包含需要异步执行大代码。执行器函数接受两个参数,分别是resolve()和reject()函数,这两个函数由JavaScript引擎提供,不需要用户自己编写。异步操作结束成功时调用resolve()函数,失败时调用reject()函数。如:
const promise = new Promise(function(resolve, reject) {
// 开启异步操作
setTimeout(() => {
try{
let c = 6 / 2
resolve(c)
}catch(err){
reject(err)
}
}, 1000)
})
- 创建已处理的Promise
要将一个现有的对象转换为Promise对象,可以调用Promise.resolve()方法,该方法接受一个参数并返回一个完成状态的Promise,之后再返回的Promise对象上调用then()方法来获取值。如:
const promise = Promise.resolve('hello react.js')
promise.then(rs => console.log(rs)) // hello react.js
- 响应多个Promise
需要等待多个异步任务完成后,再执行下一步的操作可以调用Promise.all()方法,该方法接受一个参数并返回一个新的Promise对象,参数是一个包含多个Promise的可迭代对象。
const promise1 = new Promise((resolve, reject) => {
resolve(''1)
})
const promise2 = new Promise((resolve, reject) => {
resolve('2')
})
Promise.all([promise1, promise2]).then(rs => {
console.log(rs)
}).catch(err => {
console.log(err)
})
ES6还提供Promise.race()方法,同样是传入多个Promise对象,和Promise.all()区别是,该方法只要有一个Promise成功或失败就返回。
const promise1 = new Promise((resolve, reject) => {
resolve(''1)
})
const promise2 = new Promise((resolve, reject) => {
resolve('2')
})
Promise.race([promise1, promise2]).then(rs => {
console.log(rs)
}).catch(err => {
console.log(err)
})
网友评论