ES6中的promise对象
Promise 从本质上来讲就是一个构造函数
Promise对象是ES6中新增的一种解决异步操作的新的方案
是异步编程的一种解决方案,从语法上说Promise是一个对象,可以获取操作的消息
使用回调函数解决异步操作会产生什么问题呢 --- 回调地狱
什么时候会出现回调地狱? ---- 当多个异步操作的结果相互依赖的时候就会出现回调地狱
为了解决回调地狱问题,在ES6中才引进了新的解决异步操作的方案 ---Promise对象
promise对象的基本使用:
1. 用法:Promise对象其实就是一个容器,存放异步操作
resolve,reject是两个函数类型的参数,作用就是处理异步操作的结果(resolve: 成功,reject: 失败)
resolve:是处理成功的结果
reject:是处理失败的结果
const p = new Promise(function (resolve, reject) {
setTimeout(function () {
// resolve(666) //把成功的结果抛出去
reject(888)//把失败的结果抛出去
}, 2000)
})
console.log(p);
2. 从Promise对象中拿到异步操作的结果
p.then(function (value) {
console.log('异步操作成功了结果是:', value);
}, function (reason) {
console.log('异步操作失败了原因是:', reason);
})
1. 在Promise对象中有两个属性:
state状态的特点
Promise 异步操作有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。除了异步操作的结果,任何其他操作都无法改变这个状态。
result结果:
抛出异常的结果
promise对象的链式调用
promise串联多个操作任务
promise的then()返回一个新的promise,可以开成then()的链式调用
通过then的链式调用串联多个同步/异步任务
then 方法
then 方法接收两个函数作为参数,第一个参数是 Promise 执行成功时的回调,第二个参数是 Promise 执行失败时的回调,两个函数只会有一个被调用。
1. Promise.prototype.then()
then 方法返回的是一个`新的` Promise 实例(注意,不是原来那个 Promise 实例)。因此可以采用`链式`写法,即 then 方法后面再调用另一个 then 方法
then方法的返回值:
then方法的返回值与回调函数的执行结果相关,并且无论何时then方法返回值永远是Promise对象
回调函数的执行结果和then方法返回的Promise对象的状态和结果是如何相关的?
回调函数执行结果为 非Promise对象是:
1. 报错 Promise对象状态为失败的 结果:报错的内容
2.没有报错 Promise对象状态为成功的 结果:回调函数的执行结果
回调函数的执行结果为 Promise对象时:
1. 回调函数return的那个Promise对象其实就是then方法的返回结果
2. Promise.prototype.catch()
`Promise.prototype.catch()`方法是 `.then(null, rejection)`或 `.then(undefined, rejection)`的别名,用于指定发生错误时的回调函数
3. Promise.all()
`Promise.all()`方法用于将多个`Promise` 实例,包装成一个新的 Promise 实例。
all方法:返回一个新的 promise, 只有所有的 promise 都成功才成功, 只要有一个失败了就直接失败
4. Promise.race()
`Promise.race()` 方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例。
race方法:返回一个新的 promise, 第一个完成的 promise 的结果状态就是最终的结果状态
async 和await
async:用来声明函数
特点:函数的返回值始终为一个promise对象,Promise对象的状态和结果由函数的执行结果决定
await:等待,使用同步的方式获取Promise对象,Promise对象的状态和结果由函数的执行结果决定
await 右侧的表达式一般为 promise 对象, 但也可以是其它的值;如果表达式是 promise 对象, await 返回的是 promise 成功的值;如果表达式是其它值, 直接将此值作为 await 的返回值
注:await必须写在async函数中,但是async函数中可以没有await,如果await的promise失败了,就会抛出异常,需要通过try...catch捕获异常