promise是一门新的技术(ES6规范),是JS中进行异步编程的新解决方案(旧方案是使用回调函数)。
promise从语法上来说是一个构造函数,从功能上来说,promise对象用来封装一个异步操作并可以获取其成功/失败的结果值。
异步编程有哪些? filesystem操作,数据库操作,ajax请求,定时器。
promise的优点:
1.指定回调函数的方式更加灵活 。
回调函数必须在异步任务前指定,而promise的执行流程为:启动异步任务 =》返回promise对象 =》给promise对象绑定回调函数(甚至可以在异步任务结束后指定);
2.支持链式调用,可以解决回调地狱问题。
回调地狱:回调函数嵌套调用,外部回调函数异步执行的结果是嵌套的回调执行的条件
回调地狱不便于阅读,不便于异常处理。
promise的状态:
promise实例对象拥有一个属性 PromiseState,有三个属性 pending 未决定的,resolved/fullfilled成功的,rejected失败。
promise实例对象的状态只可能拥有两种,1.pending变为resolved。2.pending变为rejected。一个promise对象只可能改变一次状态,成功的结果数据成为value,失败的结果数据称为reason。
promise实例对象状态结果保存在属性PromiseResult中。
promise执行流程:
promise函数的API
1.Promise构造函数:Promise(excutor){},excutor是执行器(resolve,reject)=>{},在promise内部立即同步调用,异步操作在执行器中执行。
2.Promise.prototype.then(onResolved,onRejected) =>{}
onResolved是成功状态的回调函数,(value) => {},
onRejected是失败状态的回调函数,(reason) =>{}
返回一个新的promise对象
3.Promise.prototype.catch方法:(onRejected)=>{}
指定失败的回调函数,(reason) => {}
4.Promise.resolve方法
返回一个Promise对象,状态取决于传入参数类型。传入的参数为非promise对象,则会返回一个成功状态的Promise对象,传入的参数为promise对象,参数对象的状态会决定返回的Promise对象的状态
5.Promise.reject方法
Promise.reject返回一个失败状态的Promise对象,无论参数是什么,都会是失败状态,即使参数传入成功状态的Promise对象,返回的Promise值是成功的Promise对象,但状态仍为失败。
6.Promise.all方法
Promise.all方法参数为Promise对象数组,若其中有一个对象是失败状态,则方法返回的Promise对象为失败状态。参数数组对象全为成功状态才会返回成功状态的对象。
7.Promise.race方法
Promise.race方法参数为Promise对象数组,返回的Promise对象状态取决于第一个状态产生变化的参数对象。
相关问题:
1.Promise如何修改状态
1.修改成功状态
resolve(value);
2.修改失败状态
reject(reason);
3.抛出异常
throw reason;
2.Promise能否进行多个回调
当promise对象改变状态时候都会调用
3.Promise指定回调和改变状态顺序问题
当执行器中执行的是同步任务时,改变状态先执行,回调函数后执行。1.在执行器中直接调用resolve()或reject() 2.延长更长时间才调用then();
当执行器中执行的是异步任务时,回调函数先执行,改变状态后执行。
4.Promise.then方法的返回结果由什么决定
1.抛出错误,会返回失败状态的promise对象
2.返回结果是非promise类型的对象,会返回成功状态promise对象,值就是返回值
3.返回结果是promise对象,返回的promise对象的值和状态由结果决定
5.Promise如何串联多个任务
1.Promise的then()返回一个新的Promise,可以写then()的链式调用。
2.通过then的链式调用,串联多个同步异步任务。
6.Promise异常穿透
1.当使用Promise的then链式调用时,可以在最后指定失败的回调。
2.前面任何操作出现了异常,最后都会传到最后的失败回调中去处理。
7.如何中断Promise链
在回调函数中返回一个pending状态的Promise对象。这样这个回调函数返回的Promise对象状态也为pending,那么后面指定的回调函数就不会被调用。
async函数
async函数返回一个 Promise 对象,返回结果是非promise类型的对象,会返回成功状态promise对象。返回结果是promise对象,返回的promise对象的值和状态由结果决定。抛出错误,会返回失败状态的promise对象。和then()方法返回值的规则是一样的。
await表达式
await表达式右边是失败状态的Promise对象,会抛出异常,需要用try...catch()捕获处理。
await表达式右边是成功状态的Promise对象,会返回此对象的PromiseResult。
await必须写在async函数中。async函数可以不写await。