ES6 Promise对象使用浅谈
1.Promise是什么?
Promise是异步编程的一种解决方案,它是一个构造函数,接受一个函数作为参数,该函数的两个参数分别是resolve和reject。因此可以用new Promise()得到一个Promise实例,它能够解决传统的回调函数嵌套带来的回调地狱问题。
Promise对象代表一种异步操作,有三种状态:pending(进行中)、fulfilled(已成功)、rejected(已失败),这几个状态一旦确定将不再改变
2. 基本语法
const promise = new Promise(function(resolve, reject){
//todo
if(异步操作成功) {
resolve(data);
} else {
reject(error)
}
})
其中:resolve函数是异步操作成功时的回调,并将异步操作的结果作为参数传递出去;
reject函数是异步操作失败时的回调,并将异步操作报出的错误作为参数传递出去;
3. 使用Promise.prototype.then()方法指定resolve和reject的回调函数
then()方法中第一个参数是成功时的回调,第二个参数可选,表示失败时的回调
promise.then(function(data), {
//成功回调todo
}, function(error) {
//失败回调todo
})
4. 使用Promise.prototype.catch()方法捕获异常
Promise.prototype.catch()方法是.then(null, reject)的别名,用于指定发生错误时的回调函数
promise.then(function(data), {
//成功回调todo
}).catch(functiion(error) {
//捕获错误error
})
如果异步操作抛出错误,就会调用catch方法指定的回调函数,处理这个错误,另外, then方法指定的回调函数,如果运行中抛出错误,也会被catch方法捕获;
Promise 对象的错误具有“冒泡”性质,会一直向后传递,直到被捕获为止;
一般来说,不要在then方法里面定义 reject 状态的回调函数(即then的第二个参数),总是使用catch方法
5. Promise.prototype.finally()方法
finally方法用于指定不管 Promise 对象最后状态如何,都会执行的操作。该方法是 ES2018 引入标准的。
finally方法回调函数不接受任何参数;
promise.then(function(data), {
//成功回调todo
}).catch(functiion(error) {
//捕获错误error
}).finally(functiion() {
//finally方法回调函数不接受任何参数
})
6. 还有一些其它的api,
如Promise.all(),用于将多个 Promise 实例,包装成一个新的 Promise 实例,只有包装的这几个Promise实例都是resolve状态,包装后的Promise才是resolve,否则是reject状态
Promise.race(),
Promise.resolve(),
Promise.reject()
7. 一个异步加载图片的例子