定义
MDN定义
1 Promise对象用作异步计算
2 一个Promise代表一个现在、将来或者永不可能可用的值
3 可将异步操作队列化,使其按照期望的额顺序执行,并返回符合预期的结果
4 可在对象直接传递和操作promise,帮助我们处理队列
Why Promise
异步操作常见语法
1 事件侦听与响应 addEventListener
2 回调 如ajax
###
1 回调地狱,调试不方便,不好维护
2 无法使用 try catch错误处理机制 throw return
3 无法正常检索堆栈信息,每一次回调都是在系统层面的调用
4 多个回调函数之前难以建立联系
Promise详解
new Promise(function(resove,reject){
//执行器函数
//一段耗时很长的异步操作
resolve();//数据处理完成
reject();//数据处理出错
//resolve reject会改变promise实例的状态,如果数据处理完成则调用then的第一个函数,出错则会调用then()的第二个响应函数
}).then(function(A){
//成功 下一步
},function(){
//失败
})
Promise三个状态
pending 初始状态
fulfilled 成功
rejected 失败
promise状态发生改变就会触发then promise状态一经改变不会发生改变
注意:如果在then中不直接返回promise实例对象,将会执行下一步操作,即使返回值为false,false将会作为返回值传递到相应的then函数中。
then()
接收两个函数作为参数分别代表 fulfilled rejected
then()可以返回一个新的promise实例,所以可以链式调用
当前面的promise状态改变时,then()根据其最终状,选择响应函数执行。
状态响应函数可以返回新的promise或者其他值
如果返回新的promise 那么下一级.then()会在新的promise状态改变之后执行
如果返回其他任何值,则会立即执行下一级then()
then()里面有then(),则外面的then会等里面的then()全部执行完才执行
then()如果参数不符合规范则会被忽略,执行后面的步骤
错误处理
promise会自动捕获内部异常,并交给reject执行
两种方法:
1 reject(‘error’) .then(null,message=>{})
2 throw new Error(‘error’) .catch(message=>{})
catch()也会产生一个promise实例
catch()可以与then()连用
建议在最后都加一个catch操作以便处理错误。
Promise.all()
接收一个数组,返回一个新的promise,数组里可以是promise对象,也可以是别的值,只有promise会等待状态改变
当所有子promise都完成,返回值是全部promise返回值的组成的数组
当有任何一个结果失败,则该promise失败,返回值是第一个失败的子promise的结果
Promise.race()
接收一个数组,当任一个promise完成则状态改变
Promise一旦创建立刻执行
Promise.resolve()
1 参数为空,返回一个状态为fulfilled的promise实例
2 参数是一个跟promise无关的值,则同上,但是fulfilled函数为接收到这个参数
3 若参数为promise实例,则返回该实例,不做任何修改。
4 若参数为thenable则立即执行
Promise.reject
类似Promise.resolve返回一个状态为rejected的promise实例