Promise对象
一、什么是Promise?
- Promise是一种异步操作的解决方案,将写法复杂的传统的回调函数和监听事件的异步操作,用同步代码的形式表达出来。
- Promise避免了多级异步操作的回调函数嵌套。
- Promise最早是一个函数库,现在已经被ES6写入标准用法。
- Promise是一种构造函数。
- Promise实例创建后会立即执行。
二、Promise的基本使用
console.log("1") new Promise((resolve,reject)=>{ // resolve,reject是形式参数,可以是任意写法,如(res, rej),默认第一个参数实现的是resolve功能;第二个参数实现的是reject功能。 console.log("2") resolve("成功了") console.log("3") //resolve()不同于return, resolve()执行完成后后面的代码还会执行。 }) 执行结果: 1 2 3 Promise {<fulfilled>: "成功了"} // 一般状态改变后的操作放在then回调函数中 // 所以最好写成 new Promise((resolve,reject)=>{ console.log("2") return resolve("成功了") console.log("3") //不再执行,最好不要在状态改变后添加操作 }) //resolve()不同于return, resolve()执行完成后后面的代码还会执行。 创建实例如下: const p = new Promise((resolve,reject)=>{ //需要实现的异步操作 ........ ........ if("success") resolve(value) // resolve是js引擎提供定的成功后调用的函数,作用就是手动将该promise的状态由,pending(未完成)变为fulfilled(异步操作成功),然后立即触发then中的成功回调函数 // value值是异步操作的结果,要传给后面的回调函数的值 // 值的内容可以根据业务需求自己定;可以是值(普通对象,函数,字符,数字等)也可以是Promise对象 else reject(new Error) //reject也是js引擎提供的失败后调用的函数,作用就是手动将状态由pending变为 //ejected(异步操作失败),参数是抛出的异常。然后才能触发then中的错误回调函数或者catch中的回调函数 })
三、Promise的实例方法
1. Promise.prototype.then()
是什么:then方法是Promise构造函数原型对象上的方法。
作用: 为实例状态改变时添加回调函数(相当于实例状态变化的监听函数)。
第一个函数是实例状态变为resolved(fulfilled)时的回调函数;
p.then(function(value){ // 前面实例中resolve方法执行后触发该方法,即状态为fulfilled(resolved)状态时触发的回调函数 // value值就是resolve的参数值 },function(err) { // 前面实例中reject方法执行后会触发该方法,即状态为rejected时 })
(2).then方法返回一个新的Promise实例,所以可以采用链式写法;
then方法的第一个回调函数的返回值,即return的值作为下一个then方法里面的函数传参。
如果返回值不是Promise对象,会触发下一个then方法的第一个回调函数, 并且返回值作为回调函数的参数;
2. Promise.prototype.catch()
是什么:Promise原型上的catch方法,相当于.then(null/undefined, () => {}),所以返回的也是promise,后面还可以跟then或者catch,只在rejected状态触发。
作用: 它可以捕获所有之前执行的promise中的错误,最好所有的promise都在最后使用catch方法,不要在then方法中写第二个回调函数
p.then((val) => { throw new Error("Failed"); }).then((val) => { // Todo }).catch((err) => { console.log(err); // Error: Failed 捕获内部异常 })
3. Promise.prototype.finally()
作用:不管状态(不能是pending)如何,都会执行的方法。
new Promise((resolve,reject) => { // 状态修改为resolved或者rejected }).finally(() => {...} )
finally方法最后返回一个promise实例,回调函数不接受任何值,return方法也被忽略。
但是会默认返回之前的实例对象传递的参数。
应用:
四、Promise常用的两个静态方法
1、Promise.all()
接受一个数组(每个参数都是promise实例)作为参数。
如果参数不是promise实例,系统会自动调用Promise.resolve()方法,将参数转为promise实例。
const arr = [1,2]; Promise.all(arr) // 相当于 arr.map(item => Promise.resolve(item)) .then(data => console.log('data-->',data)) //运行结果如下: // data--> [1,2]
2、Promise.race()
参数性质和Promise.all()一样,都是以参数为Promise实例的数组为参数。
返回一个新的Promise实例。
作用不一样:
只要有一个参数实例的状态发生改变,新的实例的状态随之改变,参数实例的返回值作为对应的回调函数的参数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。