Promise
Promise 是异步编程的一种解决方案
所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。
Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理
原理
-
对象的状态不受外界影响
-
有三种状态: pending (进行中)、fulfilled (已成功)和rejected (已失败)
-
一旦状态改变,就不会再变,任何时候都可以得到这个结果
-
Promise对象的状态改变,只有两种可能:从pending变 为fulfilled和从pending变为rejected.
-
如果异步操作成功了(读文件成功了),从pending(进行中)变为fulfilled (已成功),从pending变为fulfilled
-
如果异步操作失败了(读文件失败了),从pending (进行中)变为rejected (已失败) , 从pending变为rejected
-
只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态 特点
让异步操作有顺序本质是:
在异步操作成功后的回调函数里返回另外的promise,调用他的then方法.
Promise对象是一个构造函数,用来生成Promise实例。
步骤
let newPromise = new Promise((resolve,reject)=>{
// code
// 成功掉用
resolve();
// 失败调用
reject();
})
newPrimise.then(()=>{
// 这里是成功时调用的方法
},()=>{
// 这里是失败时调用的方法
})
Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。它们是两个函数,由 JavaScript 引擎提供,不用自己部署。
- resolve
将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去
2 reject
reject函数的作用是,将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
then方法
Promise实例生成以后,可以用then方法分别指定resolved状态和rejected状态的回调函数。
异步操作成功后调用resolve()方法,他内部调用了then()里面的第一个参数函数
异步操作失败后调用reject()方法,他内部调用了then()里面的第二个参数函数.
函数名.then(参数1,参数2)
参数1 : 回调函数是Promise对象的状态变为resolved时调用
参数2 : (可选)第二个回调函数是Promise对象的状态变为rejected时调用
Promise方法
Promise.prototype.then()
Promise 实例具有then方法,也就是说,then方法是定义在原型对象
为 Promise 实例添加状态改变时的回调函数
Promise.prototype.catch()
用于指定发生错误时的回调函数。
promise名字.then((参数)=>{ //body }).catch((参数)=>{});
链式写法
在同时用多个then方法时,只需要在最后一个then方法后借一个catch方法
这样就不用每个then方法都写调用失败那个函数了;
Promise.prototype.finally()
用于指定不管 Promise 对象最后状态如何,都会执行的操作
Promise.all()
let 名字 = Promise.all([实例1,实例2,实例3,...])
名字.then((参数)=>{ //body }) //
// 每一个promise实例都要成功才会成功,相当于是并且.
用于将多个 Promise 实例,包装成一个新的 Promise 实例
Promise.race()
let 名字 = Promise.race([实例1,实例2,实例3,...])
名字.then((参数)=>{ //body })
//有一个promise实例成功就会成功,相当于是或者.
将多个 Promise 实例,包装成一个新的 Promise 实例
Promise.allSettled()
接受一组 Promise 实例作为参数,包装成一个新的 Promise 实例。只有等到所有这些参数实例都返回结果,不管是fulfilled还是rejected,包装实例才会结束
Promise.any()
接受一组 Promise 实例作为参数,包装成一个新的 Promise 实例。只要参数实例有一个变成fulfilled状态,包装实例就会变成fulfilled状态;如果所有参数实例都变成rejected状态,包装实例就会变成rejected状态
不会因为某个 Promise 变成rejected状态而结束。