promise是啥就不做介绍了, 直接入正题
基本使用
var p1 = new Promise((resolve, reject) => {
//异步操作, 异步完成调用resolve改变状态, 失败调用reject改变promise的状态
setTimeout(()=>{
resolve(1)
}, 0)
})//返回一个promise对象
p1.then(function(){ //promise对象的状态为resolve时的处理函数
}).catch(function(){ //promise对象的状态为reject时的处理函数
})
以上就是基本的使用方法。
几个方法的简单说明
Promise()
构造函数,用于创建一个promise对象, 初始状态为pending, 内部调用传入的函数,执行异步操作, 并在完成或失败时调用resolve和reject改变状态,
resolve方法
改变promise状态为resolve的函数, 当异步操作成功时调用, 传入的参数被包装为一个新的promise对象, 状态为resolved, 如果传入的参数本身就是一个promise对象, 则返回的promise对象直接使用该promise对象的状态和值
reject方法
改变promise对象状态为reject的函数, 与resolve类似。 在ES6中, 不过如果reject被调用了, 没有相关的处理函数, 将会报错
Promise.prototype.then方法
用于注册状态改变时的处理程序, 可以传入两个参数, 第一个为resolve状态时的处理函数, 第二个为reject状态时的处理函数。
从链式调用的角度来看:
promise.then(()=>{
//做些事情
}).then(()=>{
//做些事情
}).catch(()=>{})
返回值是一个新的promise对象,
调用then方法时, 如果promise对象的状态已经为resolved, 则调用then方法中的第一个参数; 如果promise对象的状态已经为rejected, 则调用then方法中的第二个参数 。其实then的返回值, 与传入的参数的返回结果有一定关系。
Promise.prototype.catch 方法
相当于then方法的另一种写法, 用于处理reject状态时的处理函数, 在es6中, 如果reject方法被调用却没有相应的处理函数处理rejected状态, 将会报错。
Promise的其他函数
在es6中, promise还有两个附加函数用于处理以后一个回调异常的情况。
1. promise.prototype.done //用于处理最后一个回调有错的情况。
2. promise.prototype.finally //done方法有错才会执行, finally不管有错没错都会执行
用于同时处理多个异步的方法:
1. Promise.all([]) //参数为promise对象组成的数组。返回一个新的promise对象。每个异步都成功时,该promise对象的状态变为resolved, 只要有一个异步失败, 都将变为rejected.。 并将该错误信息传出
2. Promise.race([]) //参数同上。 返回一个新的promise对象。 当有一个异步成功或失败, 状态就变为resolved或rejected, 并将结果传出
Promise的正确使用方式
/ 错误的写法
promise1.then(function(value) {
promise1.then(function(value) {
promise1.then(function(value) {
})
})
})
promise.then(()=>{
//做些事情
}).then(()=>{
//做些事情
}).catch(()=>{
//做些事情
}).then(()=>{
//做些事情
}).catch(()=>{
//做些事情
})
promise应该采用链式方法调用